Оператор Function (Visual Basic)

Объявляет имя, параметры и код, определяющие процедуру Function .

Синтаксис

[ <attributelist> ] [ accessmodifier ] [ proceduremodifiers ] [ Shared ] [ Shadows ] [ Async | Iterator ]
Function name [ (Of typeparamlist) ] [ (parameterlist) ] [ As returntype ] [ Implements implementslist | Handles eventlist ]
    [ statements ]
    [ Exit Function ]
    [ statements ]
End Function

Компоненты

  • attributelist

    Необязательный элемент. См. список атрибутов.

  • accessmodifier

    Необязательный элемент. Может применяться один из перечисленных ниже типов.

    См. уровни доступа в Visual Basic.

  • proceduremodifiers

    Необязательный элемент. Может применяться один из перечисленных ниже типов.

  • Shared

    Необязательный элемент. См. раздел "Общий доступ".

  • Shadows

    Необязательный элемент. См . тени.

  • Async

    Необязательный элемент. См. асинхронную инструкцию.

  • Iterator

    Необязательный элемент. См. итератор.

  • name

    Обязательный. Имя процедуры. См. раздел Declared Element Names.

  • typeparamlist

    Необязательный элемент. Список параметров типа для универсальной процедуры. См. список типов.

  • parameterlist

    Необязательный элемент. Список имен локальных переменных, представляющих параметры этой процедуры. См. список параметров.

  • returntype

    Обязательный параметр, если Option Strict имеет значение On. Тип данных значения, возвращаемого данной процедурой.

  • Implements

    Необязательный элемент. Указывает, что эта процедура реализует одну или несколько Function процедур, каждая из которых определена в интерфейсе, реализуемом содержащим класс или структуру этой процедуры. См. инструкцию Implements.

  • implementslist

    Является обязательным, если предоставлен параметр Implements. Список реализуемых процедур Function.

    implementedprocedure [ , implementedprocedure ... ]

    Каждый элемент implementedprocedure имеет перечисленные ниже синтаксис и компоненты.

    interface.definedname

    Часть Описание
    interface Обязательный. Имя интерфейса, реализованного в этой процедуре, содержащей класс или структуру.
    definedname Обязательный. Имя, под которым процедура определена в interface.
  • Handles

    Необязательный элемент. Указывает, что эта процедура может обрабатывать одно или несколько конкретных событий. См . дескрипторы.

  • eventlist

    Является обязательным, если предоставлен параметр Handles. Список событий, обрабатываемых этой процедурой.

    eventspecifier [ , eventspecifier ... ]

    Каждый элемент eventspecifier имеет перечисленные ниже синтаксис и компоненты.

    eventvariable.event

    Часть Описание
    eventvariable Обязательный. Объектная переменная, объявленная с типом данных класса или структуры, которая вызывает событие.
    event Обязательный. Имя события, которое обрабатывает эта процедура.
  • statements

    Необязательный элемент. Блок инструкций, выполняемых в рамках этой процедуры.

  • End Function

    Завершает определение этой процедуры.

Remarks

Весь исполняемый код должен находиться внутри процедуры. Каждая процедура, в свою очередь, объявляется в классе, структуре или модуле, который называется содержащим классом, структурой или модулем.

Чтобы вернуть значение вызывающем коду, используйте процедуру; в противном случае используйте Function процедуру Sub .

Определение функции

Процедуру Function можно определить только на уровне модуля. Таким образом, контекст объявления для функции должен быть классом, структурой, модулем или интерфейсом и не может быть исходным файлом, пространством имен, процедурой или блоком. Дополнительные сведения см. в разделе Контексты объявления и уровни доступа по умолчанию.

Function Процедуры по умолчанию — открытый доступ. Вы можете настроить их уровни доступа с помощью модификаторов доступа.

Function Процедура может объявить тип данных значения, возвращаемого процедурой. Можно указать любой тип данных или имя перечисления, структуру, класс или интерфейс. Если параметр не указан returntype , процедура возвращается Object.

Если в этой процедуре используется ключевое Implements слово, содержащий класс или структуру, также должен быть Implements оператор, который немедленно следует за его Class или Structure оператором. Оператор Implements должен содержать каждый интерфейс, указанный в implementslist. Однако имя, по которому интерфейс определяет Function (in definedname), не обязательно совпадает с именем этой процедуры (in name).

Примечание

Для определения встроенных выражений функций можно использовать лямбда-выражения. Дополнительные сведения см. в разделе "Выражение функции " и "Лямбда-выражения".

Возврат из функции

Function Когда процедура возвращается в вызывающий код, выполнение продолжается с инструкцией, следующей за оператором, который вызвал процедуру.

Чтобы вернуть значение из функции, можно назначить значение имени функции или включить его в инструкцию Return .

Инструкция Return одновременно назначает возвращаемое значение и завершает функцию, как показано в следующем примере.

Function MyFunction(ByVal j As Integer) As Double
    Return 3.87 * j
End Function

В следующем примере возвращается возвращаемое значение имени myFunction функции, а затем используется оператор Exit Function для возврата.

Function MyFunction(ByVal j As Integer) As Double
    MyFunction = 3.87 * j
    Exit Function
End Function

Операторы Exit Function и Return операторы вызывают немедленный выход из Function процедуры. Любое количество Exit Function операторов и Return инструкций может отображаться в любом месте процедуры, и вы можете смешивать и Return смешивать Exit Function инструкции.

При использовании Exit Function без назначения значения nameпроцедура возвращает значение по умолчанию для типа данных, указанного в returntype. Если returntype значение не указано, процедура возвращает Nothingзначение по умолчанию для Object.

Вызов функции

Вы вызываете процедуру Function , используя имя процедуры, за которой следует список аргументов в скобках в выражении. Круглые скобки можно опустить, только если аргументы не указаны. Однако код становится более удобочитаемым, если вы всегда включаете круглые скобки.

Вы вызываете процедуру Function так же, как и любую функцию библиотеки, например Sqrt, Cosили ChrW.

Функцию также можно вызвать с помощью ключевого Call слова. В этом случае возвращаемое значение игнорируется. В большинстве случаев не рекомендуется использовать ключевое Call слово. Дополнительные сведения см. в разделе "Оператор вызова".

Visual Basic иногда переупорядочение арифметических выражений для повышения внутренней эффективности. По этой причине не следует использовать процедуру Function в арифметическом выражении, когда функция изменяет значение переменных в одном выражении.

Асинхронные функции

Функция Async позволяет вызывать асинхронные функции, не используя явные обратные вызовы или вручную разделяя код между несколькими функциями или лямбда-выражениями.

Если пометить функцию модификатором Async , можно использовать оператор Await в функции. Когда элемент управления достигает Await выражения в Async функции, элемент управления возвращается вызывающей объекту, а ход выполнения функции приостанавливается до тех пор, пока ожидающая задача не завершится. После завершения задачи выполнение может возобновиться в функции.

Примечание

Процедура Async возвращается вызывающему объекту при обнаружении первого ожидающего объекта, который еще не завершен, или возвращается к концу Async процедуры, в зависимости от того, что происходит первым.

Функция Async может иметь тип возвращаемого Task<TResult> значения или Task. Ниже приведен пример Async функции с типом возвращаемого Task<TResult> значения.

Функция Async не может объявлять параметры ByRef .

Вложенный оператор также можно пометить модификаторомAsync. Это в первую очередь используется для обработчиков событий, где значение не может быть возвращено. Процедуру AsyncSub нельзя ожидать, и вызывающийSubAsyncобъект процедуры не может перехватывать исключения, создаваемые процедуройSub.

Дополнительные сведения о Async функциях см. в разделе асинхронное программирование с помощью Async и Await, управление Flow в асинхронных программах и асинхронных типах возвращаемых значений.

Функции итератора

Функция итератора выполняет пользовательскую итерацию по коллекции, например список или массив. Функция итератора использует инструкцию Yield для возврата каждого элемента по одному за раз. При достижении инструкции Yield текущее расположение в коде запоминается. При следующем вызове функции итератора выполнение возобновляется с этого места.

Вы вызываете итератор из клиентского кода с помощью for Each... Следующая инструкция.

Тип возвращаемого значения функции итератора может быть IEnumerable, IEnumerable<T>или IEnumeratorIEnumerator<T>.

Дополнительные сведения см. в разделе Итераторы.

Пример 1

В следующем примере оператор используется Function для объявления имени, параметров и кода, образующих тело Function процедуры. Модификатор ParamArray позволяет функции принимать переменное число аргументов.

Public Function CalcSum(ByVal ParamArray args() As Double) As Double
    CalcSum = 0
    If args.Length <= 0 Then Exit Function
    For i As Integer = 0 To UBound(args, 1)
        CalcSum += args(i)
    Next i
End Function

Пример 2

В следующем примере вызывается функция, объявленная в предыдущем примере.

Module Module1

    Sub Main()
        ' In the following function call, CalcSum's local variables 
        ' are assigned the following values: args(0) = 4, args(1) = 3, 
        ' and so on. The displayed sum is 10.
        Dim returnedValue As Double = CalcSum(4, 3, 2, 1)
        Console.WriteLine("Sum: " & returnedValue)
        ' Parameter args accepts zero or more arguments. The sum 
        ' displayed by the following statements is 0.
        returnedValue = CalcSum()
        Console.WriteLine("Sum: " & returnedValue)
    End Sub

    Public Function CalcSum(ByVal ParamArray args() As Double) As Double
        CalcSum = 0
        If args.Length <= 0 Then Exit Function
        For i As Integer = 0 To UBound(args, 1)
            CalcSum += args(i)
        Next i
    End Function

End Module

Пример 3

В следующем примере DelayAsync используется AsyncFunction тип возвращаемого Task<TResult>значения. DelayAsync имеет инструкцию Return , которая возвращает целое число. Поэтому объявление DelayAsync функции должно иметь тип возвращаемого Task(Of Integer)значения . Так как возвращаемый тип имеет значение Task(Of Integer), вычисление Await выражения в DoSomethingAsync создает целое число. Это демонстрируется в следующем операторе: Dim result As Integer = Await delayTask.

Процедура startButton_Click является примером Async Sub процедуры. Поскольку DoSomethingAsync это Async функция, задача для вызова DoSomethingAsync должна ожидаться, как показано в следующем операторе: Await DoSomethingAsync() Процедура startButton_ClickSub должна быть определена с модификатором Async , так как она содержит Await выражение.

' Imports System.Diagnostics
' Imports System.Threading.Tasks

' This Click event is marked with the Async modifier.
Private Async Sub startButton_Click(sender As Object, e As RoutedEventArgs) Handles startButton.Click
    Await DoSomethingAsync()
End Sub

Private Async Function DoSomethingAsync() As Task
    Dim delayTask As Task(Of Integer) = DelayAsync()
    Dim result As Integer = Await delayTask

    ' The previous two statements may be combined into
    ' the following statement.
    ' Dim result As Integer = Await DelayAsync()

    Debug.WriteLine("Result: " & result)
End Function

Private Async Function DelayAsync() As Task(Of Integer)
    Await Task.Delay(100)
    Return 5
End Function

'  Output:
'   Result: 5

См. также раздел