Оператор 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
Необязательно. Может применяться один из перечисленных ниже типов.
MustOverride Overrides
NotOverridable Overrides
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
. Однако имя, с помощью которого интерфейс определяет Function
(в definedname
) не обязательно совпадает с именем этой процедуры (в 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
. Это в основном используется для обработчиков событий, где нельзя возвращать значение. Процедуру Async
Sub
нельзя ожидать, и вызывающий Sub
Async
объект процедуры не может перехватывать исключения, которые создаются процедурой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
используется Async
Function
тип возвращаемого 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_Click
Sub
должна быть определена с модификатором 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