<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # Visual Basic 中的過程&函數 > 原文: [https://zetcode.com/lang/visualbasic/procedures/](https://zetcode.com/lang/visualbasic/procedures/) 在本部分中,您將學習 Visual Basic 過程&函數。 我們使用過程和函數來創建模塊化程序。 Visual Basic 語句分組在由`Sub`,`Function`和匹配的`End`語句包圍的塊中。 兩者之間的區別在于函數返回值,過程不返回值。 過程和函數是較大程序中的一段代碼。 他們執行特定任務。 使用過程和函數的優點是: * 減少代碼重復 * 將復雜的問題分解成更簡單的部分 * 提高代碼的清晰度 * 重用代碼 * 信息隱藏 ## 過程 過程是`Sub`,`End Sub`語句內的 Visual Basic 語句塊。 過程不返回值。 ```vb Option Strict On Module Example Sub Main() SimpleProcedure() End Sub Sub SimpleProcedure() Console.WriteLine("Simple procedure") End Sub End Module ``` 此示例顯示了過程的基本用法。 在我們的程序中,我們有兩個過程。 `Main()`過程和用戶??定義的`SimpleProcedure()`。 眾所周知,`Main()`過程是 Visual Basic 程序的入口點。 ```vb SimpleProcedure() ``` 每個過程都有一個名稱。 在`Main()`過程中,我們調用了用戶定義的`SimpleProcedure()`過程。 ```vb Sub SimpleProcedure() Console.WriteLine("Simple procedure") End Sub ``` 程序在`Main()`程序之外定義。 過程名稱位于`Sub`語句之后。 當我們在 Visual Basic 程序中調用過程時,該過程將得到控制。 執行該過程塊內的語句。 過程可以采用可選參數。 ```vb Option Strict On Module Example Sub Main() Dim x As Integer = 55 Dim y As Integer = 32 Addition(x, y) End Sub Sub Addition(ByVal k As Integer, ByVal l As Integer) Console.WriteLine(k+l) End Sub End Module ``` 在上面的示例中,我們將一些值傳遞給`Addition()`過程。 ```vb Addition(x, y) ``` 在這里,我們將調用`Addition()`過程并將兩個參數傳遞給它。 這些參數是兩個`Integer`值。 ```vb Sub Addition(ByVal k As Integer, ByVal l As Integer) Console.WriteLine(k+l) End Sub ``` 我們定義了過程簽名。 過程簽名是一種描述參數和參數類型的方法,通過該方法可以對函數進行合法調用。 它包含過程的名稱,其參數及其類型,對于函數,還包含返回值。 `ByVal`關鍵字指定我們如何將值傳遞給過程。 在我們的例子中,該過程獲得兩個數值 55 和 32。將這些數字相加并將結果打印到控制臺。 ## 函數 函數是`Function`,`End Function`語句內的 Visual Basic 語句塊。 函數返回值。 有兩種基本類型的函數。 內置函數和用戶定義的函數。 內置函數是 Visual Basic 語言的一部分。 有各種數學,字符串或轉換函數。 ```vb Option Strict On Module Example Sub Main() Console.WriteLine(Math.Abs(-23)) Console.WriteLine(Math.Round(34.56)) Console.WriteLine("ZetCode has {0} characters", _ Len("ZetCode")) End Sub End Module ``` 在前面的示例中,我們使用兩個數學函數和一個字符串函數。 內置函數可幫助程序員完成一些常見任務。 在下面的示例中,我們有一個用戶定義的函數。 ```vb Option Strict On Module Example Dim x As Integer = 55 Dim y As Integer = 32 Dim result As Integer Sub Main() result = Addition(x, y) Console.WriteLine(Addition(x, y)) End Sub Function Addition(ByVal k As Integer, _ ByVal l As Integer) As Integer Return k+l End Function End Module ``` 兩個值傳遞給該函數。 我們將這兩個值相加,然后將結果返回到`Main()`函數。 ```vb result = Addition(x, y) ``` 調用加法函數。 該函數返回結果,并將該結果分配給結果變量。 ```vb Function Addition(ByVal k As Integer, _ ByVal l As Integer) As Integer Return k+l End Function ``` 這是加法函數簽名及其主體。 它還包括用于返回值的返回數據類型。 在我們的例子中是`Integer`。 使用`Return`關鍵字將值返回給調用方。 ## 按值傳遞參數,按引用傳遞 Visual Basic 支持將參數傳遞給函數的兩種方法。 按值和引用。 為此,我們有兩個關鍵字。 `ByVal`和`ByRef`。 當我們按值傳遞參數時,該函數僅適用于值的副本。 當我們處理大量數據時,這可能會導致性能開銷。 當我們通過引用傳遞值時,該函數會收到對實際值的引用。 修改后,原始值會受到影響。 這種傳遞值的方式更加節省時間和空間。 另一方面,它更容易出錯。 我們應該使用哪種方式傳遞參數? 這取決于實際情況。 假設我們有一組數據,即員工工資。 如果我們要計算數據的某些統計信息,則無需修改它們。 我們通過值。 如果我們處理大量數據,并且計算速度至關重要,則可以引用。 如果我們要修改數據,例如進行一些減薪或加薪,我們可以引用一下。 以下兩個示例涵蓋了這兩個概念。 ```vb Option Strict On Module Example Dim a As Byte = 4 Dim b As Byte = 7 Sub Main() Console.WriteLine("Outside Swap procedure") Console.WriteLine("a is {0}", a) Console.WriteLine("b is {0}", b) Swap(a, b) Console.WriteLine("Outside Swap procedure") Console.WriteLine("a is {0}", a) Console.WriteLine("b is {0}", b) End Sub Sub Swap(ByVal a As Byte, ByVal b As Byte) Dim temp As Byte temp = a a = b b = temp Console.WriteLine("Inside Swap procedure") Console.WriteLine("a is {0}", a) Console.WriteLine("b is {0}", b) End Sub End Module ``` `Swap()`過程在`a`和`b`變量之間交換數字。 原始變量不受影響。 ```vb Dim a As Byte = 4 Dim b As Byte = 7 ``` 最初,這兩個變量被啟動。 ```vb Swap(a, b) ``` 我們稱為`Swap()`過程。 該過程將`a`和`b`變量作為參數。 ```vb temp = a a = b b = temp ``` 在`Swap()`過程中,我們更改了值。 請注意,`a`和`b`變量是在本地定義的。 它們僅在`Swap()`程序內有效。 ```vb $ ./swap1.exe Outside Swap procedure a is 4 b is 7 Inside Swap procedure a is 7 b is 4 Outside Swap procedure a is 4 b is 7 ``` 輸出顯示原始變量不受影響。 下一個代碼示例通過引用將值傳遞給函數。 原始變量在`Swap()`過程中更改。 ```vb Option Strict On Module Example Dim a As Byte = 4 Dim b As Byte = 7 Sub Main() Console.WriteLine("Outside Swap procedure") Console.WriteLine("a is {0}", a) Console.WriteLine("b is {0}", b) Swap(a, b) Console.WriteLine("Outside Swap procedure") Console.WriteLine("a is {0}", a) Console.WriteLine("b is {0}", b) End Sub Sub Swap(ByRef a As Byte, ByRef b As Byte) Dim temp As Byte temp = a a = b b = temp Console.WriteLine("Inside Swap procedure") Console.WriteLine("a is {0}", a) Console.WriteLine("b is {0}", b) End Sub End Module ``` 在此示例中,調用`Swap()`過程將更改原始值。 ```vb Sub Swap(ByRef a As Byte, ByRef b As Byte) ... End Sub ``` 現在,我們使用`ByRef`關鍵字來指示我們通過引用傳遞參數。 ```vb $ ./swap2.exe Outside Swap procedure a is 4 b is 7 Inside Swap procedure a is 7 b is 4 Outside Swap procedure a is 7 b is 4 ``` 在這里,我們看到`Swap()`過程確實改變了變量的值。 ## 遞歸 在數學和計算機科學中,遞歸是一種定義函數的方法,其中所定義的函數在其自己的定義內應用。 (維基百科)換句話說,遞歸函數調用自身以完成其工作。 遞歸是解決許多編程任務的一種廣泛使用的方法。 一個典型的例子是階乘的計算。 ```vb Option Strict On Module Example Sub Main() Console.WriteLine(Factorial(4)) Console.WriteLine(Factorial(10)) End Sub Function Factorial(ByVal n As UShort) As UShort If (n=0) Return 1 Else Return n * Factorial(n-1) End If End Function End Module ``` 在此代碼示例中,我們計算兩個數字的階乘。 ```vb Return n * Factorial(n-1) ``` 在階乘函數的主體內部,我們使用經過修改的參數調用階乘函數。 該函數調用自身。 ```vb $ ./recursion.exe 24 3628800 ``` 這些就是結果。 ## 模塊作用域,程序作用域 作用域是可以引用變量的作用域。 在過程內部聲明的變量具有過程作用域。 僅在此特定過程中有效。 在模塊內部聲明的變量具有模塊作用域。 它在模塊中的任何地方都有效。 ```vb Option Strict On Module Example Dim a As Byte = 2 Sub Main() Dim b As Byte = 3 Console.WriteLine(a) SimpleProcedure() End Sub Sub SimpleProcedure() Console.WriteLine(a) ' Console.WriteLine(b) End Sub End Module ``` 在前面的示例中,我們聲明了兩個變量。 變量`a`具有模塊作用域,變量`b`具有程序作用域。 ```vb Dim a As Byte = 2 ``` 變量`a`在兩個過程之外的 Example 模塊內部聲明。 在兩個過程中均有效。 ```vb Sub Main() Dim b As Byte = 3 ... End Sub ``` 變量`b`在`Main()`過程中聲明。 僅在此有效。 在第二個過程中無效。 ```vb Sub SimpleProcedure() Console.WriteLine(a) ' Console.WriteLine(b) End Sub ``` 注釋打印`b`變量的語句。 如果我們取消注釋該行,則該示例將無法編譯。 ```vb Option Strict On Module Example Dim a As Byte = 2 Sub Main() Dim a As Byte = 3 Console.WriteLine(a) End Sub End Module ``` 在前面的示例中,我們在兩個不同的作用域中聲明了一個具有相同名稱的變量。 它們不會碰撞。 在`Main()`過程中聲明的變量將覆蓋在模塊作用域中聲明的變量。 ```vb $ ./scope2.exe 3 ``` 輸出。 ## 靜態變量 靜態變量是已靜態分配的變量,其生存期遍及整個程序運行。 (維基百科)默認的局部變量在函數的連續調用中不會保留其值。 ```vb Option Strict On Module Example Sub Main() NonStatic() NonStatic() NonStatic() NonStatic() Console.WriteLine(NonStatic) End Sub Function NonStatic() As Integer Dim x As Integer = 0 x += 1 Return x End Function End Module ``` 在上面的示例中,我們有一個普通的非靜態變量。 每次調用函數時,我們都會增加變量。 我們調用該函數 5 次。 但是,對于函數的每次調用都會啟動非靜態變量。 ```vb $ ./nonstatic.exe 1 ``` 在 5 個函數調用之后,`x`變量等于 1。 首次調用函數時,靜態變量僅啟動一次。 之后,他們保留自己的值。 ```vb Option Strict On Module Example Sub Main() StaticFunction() StaticFunction() StaticFunction() StaticFunction() Console.WriteLine(StaticFunction) End Sub Function StaticFunction() As Integer Dim Static x As Integer = 0 x += 1 Return x End Function End Module ``` 連續 5 次通話后,`x`等于 5。 ```vb Dim Static x As Byte = 0 ``` 靜態變量是使用`Static`關鍵字創建的。 ```vb $ ./static.exe 5 ``` 運行示例。 在 Visual Basic 教程的這一部分中,我們介紹了過程和函數。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看