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

Объявляет имя, параметры и код, которые определяют Function процедуры.Declares the name, parameters, and code that define a Function procedure.

СинтаксисSyntax

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

ЧастиParts

  • attributelist

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

  • accessmodifier

    Необязательный параметр.Optional. Ниже указаны доступные значения.Can be one of the following:

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

  • proceduremodifiers

    Необязательный параметр.Optional. Ниже указаны доступные значения.Can be one of the following:

  • Shared

    Необязательный параметр.Optional. См. в разделе общих.See Shared.

  • Shadows

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

  • Async

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

  • Iterator

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

  • name

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

  • typeparamlist

    Необязательный параметр.Optional. Список параметров типа для универсальной процедуры.List of type parameters for a generic procedure. См. в разделе введите список.See Type List.

  • parameterlist

    Необязательный параметр.Optional. Список имен локальных переменных, представляющих параметры этой процедуры.List of local variable names representing the parameters of this procedure. См. в разделе список параметров.See Parameter List.

  • returntype

    Обязателен, если Option Strict является On.Required if Option Strict is On. Тип данных значения, возвращаемые этой процедурой.Data type of the value returned by this procedure.

  • Implements

    Необязательный параметр.Optional. Указывает, что эта процедура реализует один или несколько Function процедуры, каждая из которых определена в интерфейс, реализуемый этой процедуры классом или структурой.Indicates that this procedure implements one or more Function procedures, each one defined in an interface implemented by this procedure's containing class or structure. См. в разделе реализует оператор.See Implements Statement.

  • implementslist

    Является обязательным, если предоставлен параметр Implements.Required if Implements is supplied. Список реализуемых процедур Function.List of Function procedures being implemented.

    implementedprocedure [ , implementedprocedure ... ]

    Каждый элемент implementedprocedure имеет перечисленные ниже синтаксис и компоненты.Each implementedprocedure has the following syntax and parts:

    interface.definedname

    ОтделениеPart ОписаниеDescription
    interface Обязательный.Required. Имя интерфейса, реализуемого этой процедуры содержащей класса или структуры.Name of an interface implemented by this procedure's containing class or structure.
    definedname Обязательный.Required. Имя, под которым процедура определена в interface.Name by which the procedure is defined in interface.
  • Handles

    Необязательный параметр.Optional. Указывает, что эта процедура может обрабатывать один или несколько определенных событий.Indicates that this procedure can handle one or more specific events. См. в разделе обрабатывает.See Handles.

  • eventlist

    Является обязательным, если предоставлен параметр Handles.Required if Handles is supplied. Список событий, которые обрабатывает эту процедуру.List of events this procedure handles.

    eventspecifier [ , eventspecifier ... ]

    Каждый элемент eventspecifier имеет перечисленные ниже синтаксис и компоненты.Each eventspecifier has the following syntax and parts:

    eventvariable.event

    ОтделениеPart ОписаниеDescription
    eventvariable Обязательный.Required. Объектной переменной, объявленной с типом данных класса или структуры, который вызывает событие.Object variable declared with the data type of the class or structure that raises the event.
    event Обязательный.Required. Имя события, которое обрабатывает эту процедуру.Name of the event this procedure handles.
  • statements

    Необязательный параметр.Optional. Блок операторов, выполняемый в рамках этой процедуры.Block of statements to be executed within this procedure.

  • End Function

    Завершает определение этой процедуры.Terminates the definition of this procedure.

ПримечанияRemarks

Весь исполняемый код должен быть внутри процедуры.All executable code must be inside a procedure. Каждая процедура в свою очередь, объявляется внутри класса, структуры или модуль, который называется содержащего класса, структуры или модуля.Each procedure, in turn, is declared within a class, a structure, or a module that is referred to as the containing class, structure, or module.

Чтобы вернуть значение в вызывающий код, используйте Function процедуры; в противном случае используйте Sub процедуры.To return a value to the calling code, use a Function procedure; otherwise, use a Sub procedure.

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

Вы можете определить Function процедуры только на уровне модуля.You can define a Function procedure only at the module level. Таким образом контекст объявления для функции должен быть класс, структура, модуль или интерфейс и не может быть исходным файлом, пространство имен, процедура или блок.Therefore, the declaration context for a function must be a class, a structure, a module, or an interface and can't be a source file, a namespace, a procedure, or a block. Дополнительные сведения см. в разделе Контексты объявления и уровни доступа по умолчанию.For more information, see Declaration Contexts and Default Access Levels.

Function процедуры по умолчанию для общего доступа.Function procedures default to public access. Вы можете настроить уровни доступа с помощью модификаторов доступа.You can adjust their access levels with the access modifiers.

Объект Function процедуре можно объявить тип данных, процедура возвращает значения.A Function procedure can declare the data type of the value that the procedure returns. Можно указать любой тип данных или имя перечисления, структуры, класса или интерфейса.You can specify any data type or the name of an enumeration, a structure, a class, or an interface. Если вы не укажете returntype параметра, процедура возвращает Object.If you don't specify the returntype parameter, the procedure returns Object.

Если в этой процедуре используется Implements ключевое слово, содержащем классе или структуре также должен иметь Implements оператор, который следует сразу за его Class или Structure инструкции.If this procedure uses the Implements keyword, the containing class or structure must also have an Implements statement that immediately follows its Class or Structure statement. Implements Инструкция должна включать каждого интерфейса, который указан в implementslist.The Implements statement must include each interface that's specified in implementslist. Тем не менее имя, по которому определяется интерфейс Functiondefinedname) не должно совпадать с именем этой процедуры (в name).However, the name by which an interface defines the Function (in definedname) doesn't need to match the name of this procedure (in name).

Примечание

Лямбда-выражения можно использовать для определения выражения встроенную функцию.You can use lambda expressions to define function expressions inline. Дополнительные сведения см. в разделе выражение функции и лямбда-выражения.For more information, see Function Expression and Lambda Expressions.

Возврат из функцииReturning from a Function

Когда Function процедура возвращает в вызывающий код, выполнение продолжается с оператора, который расположен после оператора, который вызвал процедуру.When the Function procedure returns to the calling code, execution continues with the statement that follows the statement that called the procedure.

Для возврата значения из функции, можно присвоить значение имени функции или включить ее в Return инструкции.To return a value from a function, you can either assign the value to the function name or include it in a Return statement.

Return Инструкции одновременно назначает возвращаемое значение и выход из функции, как показано в следующем примере.The Return statement simultaneously assigns the return value and exits the function, as the following example shows.

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

В следующем примере присваивается значение имени функции myFunction , а затем использует Exit Function инструкция возвращает.The following example assigns the return value to the function name myFunction and then uses the Exit Function statement to return.

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

Exit Function И Return инструкции вызывают Немедленный выход из Function процедуры.The Exit Function and Return statements cause an immediate exit from a Function procedure. Любое количество Exit Function и Return инструкций может находиться в любом в процедуре, и вы можете комбинировать Exit Function и Return инструкций.Any number of Exit Function and Return statements can appear anywhere in the procedure, and you can mix Exit Function and Return statements.

Если вы используете Exit Function без присвоения значения name, процедура возвращает значение по умолчанию для типа данных, который указан в returntype.If you use Exit Function without assigning a value to name, the procedure returns the default value for the data type that's specified in returntype. Если returntype не указан, процедура возвращает Nothing, который является значением по умолчанию для Object.If returntype isn't specified, the procedure returns Nothing, which is the default value for Object.

Вызов функцииCalling a Function

Вы вызываете Function процедуры с помощью имени процедуры, за которым следует список аргументов в скобки в выражении.You call a Function procedure by using the procedure name, followed by the argument list in parentheses, in an expression. Скобки могут опускаться только в том случае, если вы не имеет аргументов.You can omit the parentheses only if you aren't supplying any arguments. Тем не менее код является более удобочитаемым, если всегда использовать круглые скобки.However, your code is more readable if you always include the parentheses.

Вы вызываете Function процедуры, так же, что вызывать любую библиотеку функций, таких как Sqrt, Cos, или ChrW.You call a Function procedure the same way that you call any library function such as Sqrt, Cos, or ChrW.

Можно также вызвать функцию с помощью Call ключевое слово.You can also call a function by using the Call keyword. В этом случае возвращаемое значение учитывается.In that case, the return value is ignored. Использование Call ключевое слово не рекомендуется в большинстве случаев.Use of the Call keyword isn't recommended in most cases. Дополнительные сведения см. в разделе инструкции Call.For more information, see Call Statement.

Visual Basic иногда упорядочение арифметические выражения для повышения эффективности внутренней.Visual Basic sometimes rearranges arithmetic expressions to increase internal efficiency. По этой причине не следует использовать Function процедуры в арифметическом выражении, если функция изменяет значение переменных в одном выражении.For that reason, you shouldn't use a Function procedure in an arithmetic expression when the function changes the value of variables in the same expression.

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

Async позволяет вызывать асинхронные функции без использованию явных обратных вызовов или ручному разделению кода между несколькими функции или лямбда-выражения.The Async feature allows you to invoke asynchronous functions without using explicit callbacks or manually splitting your code across multiple functions or lambda expressions.

Если пометить функцию с Async модификатор, можно использовать Await оператор в функции.If you mark a function with the Async modifier, you can use the Await operator in the function. Когда управление достигает Await выражение в Async функции, управление возвращается вызывающему объекту и выполнение в функции приостанавливается до завершения выполнения ожидающей задачи.When control reaches an Await expression in the Async function, control returns to the caller, and progress in the function is suspended until the awaited task completes. После завершения задачи можно возобновить выполнение в функцию.When the task is complete, execution can resume in the function.

Примечание

Async Процедура возвращает вызывающему объекту, когда либо он встречает первый ожидаемый объект, который еще не завершено, или он получает в конец Async процедуры, что произойдет раньше.An Async procedure returns to the caller when either it encounters the first awaited object that’s not yet complete, or it gets to the end of the Async procedure, whichever occurs first.

Async Функция может иметь тип возвращаемого значения Task<TResult> или Task.An Async function can have a return type of Task<TResult> or Task. Пример Async функции с типом возвращаемого значения Task<TResult> приведен ниже.An example of an Async function that has a return type of Task<TResult> is provided below.

Async Функция не может объявлять ByRef параметров.An Async function cannot declare any ByRef parameters.

Объект оператор Sub можно также пометить Async модификатор.A Sub Statement can also be marked with the Async modifier. Это в основном используется для обработчиков событий, где не может быть возвращено значение.This is primarily used for event handlers, where a value cannot be returned. Async Sub Процедуру нельзя ожидать и вызывающий Async Sub процедура не может перехватывать исключения, вызываемые по Sub процедуры.An Async Sub procedure can't be awaited, and the caller of an Async Sub procedure can't catch exceptions that are thrown by the Sub procedure.

Дополнительные сведения о Async функции, см. в разделе асинхронное программирование с использованием Async и Await, поток управления в асинхронных программах, и асинхронные типы возвращаемых значений.For more information about Async functions, see Asynchronous Programming with Async and Await, Control Flow in Async Programs, and Async Return Types.

Функции итераторовIterator Functions

Итератор функция выполняет настраиваемую итерацию по коллекции, такие как список или массив.An iterator function performs a custom iteration over a collection, such as a list or array. Использует функцию итератор Yield инструкцию для возврата всех элементов одному за раз.An iterator function uses the Yield statement to return each element one at a time. Когда Yield оператору текущее расположение в коде запоминается.When a Yield statement is reached, the current location in code is remembered. При следующем вызове функции итератора выполнение возобновляется с этого места.Execution is restarted from that location the next time the iterator function is called.

Итератор вызывается из клиентского кода с помощью для каждого... Далее инструкции.You call an iterator from client code by using a For Each…Next statement.

Тип возвращаемого значения функции итератора может быть IEnumerable, IEnumerable<T>, IEnumerator, или IEnumerator<T>.The return type of an iterator function can be IEnumerable, IEnumerable<T>, IEnumerator, or IEnumerator<T>.

Дополнительные сведения см. в разделе Итераторы.For more information, see Iterators.

ПримерExample

В следующем примере используется Function инструкцию для объявления имени, параметров и кода, образующих текст Function процедуры.The following example uses the Function statement to declare the name, parameters, and code that form the body of a Function procedure. ParamArray Модификатор разрешает функции принимать переменное число аргументов.The ParamArray modifier enables the function to accept a variable number of arguments.

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

ПримерExample

В следующем примере вызывается функция, объявленная в предыдущем примере.The following example invokes the function declared in the preceding example.

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

ПримерExample

В следующем примере DelayAsyncAsync Function с типом возвращаемого значения Task<TResult>.In the following example, DelayAsync is an Async Function that has a return type of Task<TResult>. DelayAsync имеет инструкцию Return , которая возвращает целое число.DelayAsync has a Return statement that returns an integer. Поэтому объявление функции DelayAsync должен иметь тип возвращаемого значения Task(Of Integer).Therefore the function declaration of DelayAsync needs to have a return type of Task(Of Integer). Так как возвращаемый тип — Task(Of Integer), вычисление Await выражение в DoSomethingAsync создает целое.Because the return type is Task(Of Integer), the evaluation of the Await expression in DoSomethingAsync produces an integer. Это показано в этом операторе: Dim result As Integer = Await delayTask.This is demonstrated in this statement: Dim result As Integer = Await delayTask.

startButton_Click Процедура является примером Async Sub процедуры.The startButton_Click procedure is an example of an Async Sub procedure. Так как DoSomethingAsyncAsync функции, задача для вызова DoSomethingAsync должна быть ожидаемой, как показано в следующей инструкции: Await DoSomethingAsync().Because DoSomethingAsync is an Async function, the task for the call to DoSomethingAsync must be awaited, as the following statement demonstrates: Await DoSomethingAsync(). startButton_Click Sub Процедура должна быть определена с помощью Async модификатор из-за Await выражение.The startButton_Click Sub procedure must be defined with the Async modifier because it has an Await expression.

' 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

См. такжеSee also