Оператор 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

Необязательный параметр. См. раздел Shared.

Shadows

Необязательный параметр. См. раздел Shadows.

Async

Необязательный параметр. См. раздел Async.

Iterator

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

name

Обязательное. Имя процедуры. Дополнительные сведения см. в разделе Имена объявленных типов (Visual Basic).

typeparamlist

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

parameterlist

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

returntype

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

Implements

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

implementslist

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

implementedprocedure [ , implementedprocedure ... ]

Каждая процедура implementedprocedure имеет следующий синтаксис и составляющие:

interface.definedname

Часть

Описание

interface

Обязательное. Имя интерфейса, реализуемого классом или структурой, где содержится данная процедура.

definedname

Обязательное. Имя, под которым процедура определена в interface.

Handles

Необязательный параметр. Указывает, что эта процедура может обрабатывать одно или несколько конкретных событий. Дополнительные сведения см. в разделе Предложение Handles (Visual Basic).

eventlist

Параметр обязателен, если указано ключевое слово Handles. Список событий, которые обрабатывает данная процедура.

eventspecifier [ , eventspecifier ... ]

Каждый описатель события eventspecifier имеет следующий синтаксис и составляющие:

eventvariable.event

Часть

Описание

eventvariable

Обязательное. Объектная переменная, объявленная с типом данных класса или структуры, где создается событие.

event

Обязательное. Имя события, которое обрабатывает данная процедура.

statements

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

End Function

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

Заметки

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

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

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

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

Для процедур Function по умолчанию установлен общий доступ. Уровни доступа можно настроить с помощью модификаторов доступа.

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

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

Примечание

Можно использовать лямбда-выражения для определения выражения встроенные функции.Дополнительные сведения см. в разделах Выражение Function (Visual Basic) и Лямбда-выражения (Visual Basic).

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

После передачи процедуре 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 может использоваться в любом месте процедуры, и их также можно использовать вместе с операторами Exit Function и Return.

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

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

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

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

Можно также вызвать функцию с помощью ключевого слова Call. В этом случае возвращаемое значение игнорирован. Использование ключевого слова Call не рекомендуется в большинстве случаев. Дополнительные сведения см. в разделе Оператор Call (Visual Basic).

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

Функции Async

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

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

Примечание

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

Функция Async может иметь тип возвращаемого значения Task или Task. Пример функции Async, которая имеет возвращаемый тип Task приведен ниже.

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

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

Дополнительные сведения о функциях Async см. в разделе Асинхронное программирование с использованием ключевых слов Async и Await (C# и Visual Basic), Поток управления в асинхронных программах (C# и Visual Basic) и Асинхронные типы возвращаемых значений (C# и Visual Basic).

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

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

Итератор можно вызывать из кода клиента с использованием выписки For each… next.

Возвращаемый тип функции может быть IEnumerable итератора, IEnumerable, IEnumerator или IEnumerator.

Дополнительные сведения см. в разделе Итераторы (C# и Visual Basic).

Пример

В следующем примере оператор 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

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

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

В следующем примере DelayAsyncAsyncFunction, который имеет тип возврата Task. 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

См. также

Задачи

Практическое руководство. Использование универсального класса (Visual Basic)

Устранение неполадок в процедурах (Visual Basic)

Ссылки

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

Список параметров (Visual Basic)

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

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

Предложение Of (Visual Basic)

Выражение Function (Visual Basic)

Основные понятия

Процедуры Function (Visual Basic)

Массивы параметров (Visual Basic)

Лямбда-выражения (Visual Basic)