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

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

    См. раздел Access levels in Visual Basic.

  • proceduremodifiers

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

  • Shared

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

  • Shadows

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

  • Async

    Необязательно. См . async.

  • Iterator

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

  • name

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

  • typeparamlist

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

  • parameterlist

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

  • returntype

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

  • Implements

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

  • implementslist

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

    implementedprocedure [ , implementedprocedure ... ]

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

    interface.definedname

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

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

  • eventlist

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

    eventspecifier [ , eventspecifier ... ]

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

    eventvariable.event

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

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

  • End Function

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

Замечания

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

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

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

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

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

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

Если эта процедура использует Implements ключевое слово, содержащий класс или структуру, также должен иметь Implements инструкцию, которая немедленно следует за его Class или Structure оператором. Оператор Implements должен включать каждый интерфейс, указанный в implementslist. Однако имя, с помощью которого интерфейс определяет Functiondefinedname) не обязательно совпадает с именем этой процедуры (в 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

Return Инструкции Exit Function вызывают немедленный 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 .

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

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

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

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

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

Возвращаемый тип функции итератора может быть IEnumerable, IEnumerable<T>IEnumeratorили IEnumerator<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 должна быть определена с модификатором AsyncAwait , так как она имеет выражение.

' 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

См. также