Процедури
Вирази та оператори - це сировина для блоків, з яких будуються програми, де в ролі блоків виступають процедури і функції.
У Visual Basic, як і в багатьох інших мовах програмування, більшість програм створюється з блоків - процедур і функцій. Весь програмний код знаходиться як би усередині цих процедур. Якщо виникає необхідність у рішенні певної задачі в будь-якому місці програми, то викликається процедура. У Visual Basic не можна ввести код між процедурами. Код завжди мусить знаходитись усередині процедури.
Давайте розберемося з поняттями, і визначимо, що буде називатись процедурою, а що функцією.
Процедура - це певний блок коду, який буде виконуватися щоразу при виклику цієї процедури. Кожна процедура починається зарезервованим словом Sub і закінчується End Sub.
От загальний синтаксис процедури:
[Private | Public | Friend] [Static] Sub name [(arglist)]
[тут якийсь код]
[Exit Sub]
[тут теж може бути якийсь код]
End Sub
Все, що вкладено в квадратні дужки - є необов’язковим. Оператор Exit Sub дозволяє достроково вийти з процедури. Іноді це дуже зручно. Слова Public, Private мають те ж значення, що і при оголошенні змінних.
arglist має такий вигляд:
[Optional] [ByVal | ByRef] [ParamArray] varname[( )] [As type] [= defaultvalue]
Розглянемо приклад процедури, яка буде виводити на екран повідомлення "Hello World!":
Private Sub ShowMessage()
MessageBox.Show("Hello World!")
End Sub
Що можна сказати про цю процедуру? Процедура має тип Private, тобто доступна буде тільки з коду саме тієї форми (модуля), де вона оголошена (згадайте типи оголошення змінних). Дана процедура не містить параметрів, про що нам говорять порожні круглі дужки. Призначення - вивести повідомлення Hello World на екран.
MessageBox - це вбудована функція Visual Basic, яка виводить на екран вікно з повідомленням, заданим як параметр. Інші параметри необов’язкові (їх всього 5).
Як викликати процедуру? Для цього досить написати ім’я процедури:
ShowMessage()
А можна і так:
Call ShowMessage() ' більш наочний варіант
Обидва цих варіанта абсолютно еквівалентні. Але для виклику процедур усе-таки краще використовувати другий варіант.
Тепер давайте змінимо цю процедуру і додамо до неї параметр, значення якого буде виводитися функцією MessageBox (замість Hello World):
Private Sub ShowMessage(ByVal message As String)
MessageBox.Show(message)
End Sub
Тепер при виклику процедури необхідно вказати параметр:
Call ShowMessage("Наша перша процедура")
Результатом виконання такої процедури буде виведення на екран повідомлення: “Наша перша процедура”. Дужки, що оточують параметр обов’язкові, якщо перед ім’ям процедури стоїть оператор Call. Якщо Call відсутній, то дужки ставити не потрібно.
Давайте розглянемо докладніше що ж відбувається при виклику нашої процедури. Зустрівши рядок з викликом нашої процедури Visual Basic перевіряє, чи потрібні даній процедурі параметри. Переконавшись в тому, що потрібні (параметр message) він передає в процедуру рядок “Наша перша процедура”. Тобто фактично в процедурі відбувається присвоєння змінній message значення “Наша перша процедура”. Ну а далі відбувається виклик функції MessageBox і виведення повідомлення на екран. Якщо кількість параметрів, переданих при виклику процедури не співпаде з кількістю параметрів в оголошенні процедури - Visual Basic згенерує помилку.
Передача параметрів
Змінні, що передаються процедурі, називають параметрами процедури.
За замовчуванням вони мають тип Object. Visual Basic дозволяє задавати тип параметрів за допомогою ключового слова As:
Function Square (ByVal a As Integer) As Integer
Передача параметрів в процедуру може здійснюватися двома способами: за значенням (by value) і за посиланням (by reference). У першому випадку в процедуру в якості змінної передається не сама змінна, а її копія. Тому зміна параметра в процедурі зачіпає не змінну, а її копію.
Для передачі в процедуру параметрів за значенням використовується ключове слово ByVal. наприклад,
Sub Ім’яПроцедури(ByVal strArg As String)
Тіло процедури
End Sub
При передачі параметрів по посиланню процедура отримує доступ до області пам'яті, в якій ця змінна зберігається, в результаті чого при зміні в процедурі параметра відбувається зміна значення змінної. Для передачі в процедуру параметрів по посиланню використовується ключове слово ByRef.
При виборі способу передачі параметра (за посиланням або за значенням) вирішальним критерієм є висновок, чи повинен параметр змінюватися в процедурі. Перевага передачі параметра за посиланням полягає в можливості повертати змінене значення параметра в програму, яка її викликала. Якщо ж параметр передається за значенням, то він гарантовано не буде змінений в ході виконання процедури. Так як при передачі за значенням відбувається копіювання об'єкта. Дані великого обсягу (наприклад, структури) більш ефективно передавати за посиланням. Як ілюстрацію відмінностей між передачею параметрів за посиланням і за значенням розглянемо приклад програми:
Sub Test(ByVal intA As Integer, ByRef refintA As Integer, _
ByVal strA As String, ByRef refstrA As String)
intA = 10
refintA = 20
strA = "Some string"
refstrA = "String changed"
End Sub
Sub Main()
Dim _intA As Integer = 1
Dim _refintA As Integer = 2
Dim _strA As String = "Hello"
Dim _refstrA As String = "World"
Test(_intA, _refintA, _strA, _refstrA)
End Sub
Після виклику процедури Test значення змінних у процедурі Main будуть наступними:
_intA = 1. Змінна була передана за значенням (процедура Test отримала копію змінної), тому її зміна в процедурі Test не змінила значення в процедурі Main;
_refintA = 20. Змінна передана по посиланню, тому процедура Test змінила її значення;
_strA = "Hello";
_refstrA = "String changed".