Как мы упоминали в предыдущей главе, подпроцедуры — это процедуры, которые не возвращают никакого значения. Мы использовали подпроцедуру Main во всех наших примерах. До сих пор мы писали консольные приложения в этих руководствах. Когда эти приложения запускаются, элемент управления переходит к процедуре Main Sub и, в свою очередь, выполняет любые другие операторы, составляющие тело программы.
Определение подпроцедур
Оператор Sub используется для объявления имени, параметра и тела подпроцедуры. Синтаксис для оператора Sub —
[Modifiers] Sub SubName [(ParameterList)] [Statements] End Sub
Куда,
-
Модификаторы — укажите уровень доступа к процедуре; Возможные значения: Общедоступный, Частный, Защищенный, Друг, Защищенный друг и информация о перегрузке, переопределении, совместном использовании и теневом копировании.
-
SubName — указывает имя Sub
-
ParameterList — указывает список параметров
Модификаторы — укажите уровень доступа к процедуре; Возможные значения: Общедоступный, Частный, Защищенный, Друг, Защищенный друг и информация о перегрузке, переопределении, совместном использовании и теневом копировании.
SubName — указывает имя Sub
ParameterList — указывает список параметров
пример
В следующем примере демонстрируется подпроцедура CalculatePay, которая принимает два параметра: часы и заработную плату и отображает общую заработную плату сотрудника.
Module mysub Sub CalculatePay(ByRef hours As Double, ByRef wage As Decimal) 'local variable declaration Dim pay As Double pay = hours * wage Console.WriteLine("Total Pay: {0:C}", pay) End Sub Sub Main() 'calling the CalculatePay Sub Procedure CalculatePay(25, 10) CalculatePay(40, 20) CalculatePay(30, 27.5) Console.ReadLine() End Sub End Module
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
Total Pay: $250.00 Total Pay: $800.00 Total Pay: $825.00
Передача параметров по значению
Это механизм по умолчанию для передачи параметров в метод. В этом механизме, когда вызывается метод, для каждого параметра значения создается новое место хранения. Значения фактических параметров копируются в них. Таким образом, изменения, внесенные в параметр внутри метода, не влияют на аргумент.
В VB.Net вы объявляете ссылочные параметры с помощью ключевого слова ByVal . Следующий пример демонстрирует концепцию —
Module paramByval Sub swap(ByVal x As Integer, ByVal y As Integer) Dim temp As Integer temp = x ' save the value of x x = y ' put y into x y = temp 'put temp into y End Sub Sub Main() ' local variable definition Dim a As Integer = 100 Dim b As Integer = 200 Console.WriteLine("Before swap, value of a : {0}", a) Console.WriteLine("Before swap, value of b : {0}", b) ' calling a function to swap the values ' swap(a, b) Console.WriteLine("After swap, value of a : {0}", a) Console.WriteLine("After swap, value of b : {0}", b) Console.ReadLine() End Sub End Module
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
Before swap, value of a :100 Before swap, value of b :200 After swap, value of a :100 After swap, value of b :200
Это показывает, что значения не меняются, хотя они были изменены внутри функции.
Передача параметров по ссылке
Ссылочный параметр — это ссылка на ячейку памяти переменной. Когда вы передаете параметры по ссылке, в отличие от значений параметров, для этих параметров не создается новое место хранения. Эталонные параметры представляют ту же область памяти, что и фактические параметры, которые передаются в метод.
В VB.Net вы объявляете ссылочные параметры, используя ключевое слово ByRef . Следующий пример демонстрирует это —
Module paramByref Sub swap(ByRef x As Integer, ByRef y As Integer) Dim temp As Integer temp = x ' save the value of x x = y ' put y into x y = temp 'put temp into y End Sub Sub Main() ' local variable definition Dim a As Integer = 100 Dim b As Integer = 200 Console.WriteLine("Before swap, value of a : {0}", a) Console.WriteLine("Before swap, value of b : {0}", b) ' calling a function to swap the values ' swap(a, b) Console.WriteLine("After swap, value of a : {0}", a) Console.WriteLine("After swap, value of b : {0}", b) Console.ReadLine() End Sub End Module
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —