Оператор 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. См. раздел Shared.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. См. инструкцию Implements.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. См. раздел Handles.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.

Оператор подвыражения также может быть помечен модификатором 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.

Итератор вызывается из клиентского кода с помощью метода For Each... Следующий оператор.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

В следующем примере DelayAsync является Async 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. Поскольку DoSomethingAsync является Asyncной функцией, необходимо ожидать, что задача для вызова 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