Процедури

Вирази та оператори - це сировина для блоків, з яких будуються програми, де в ролі блоків виступають процедури і функції.

У 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".