Шаг 23 - Инструкция Function

Описывает имя, аргументы и текст программы, составляющий тело процедуры Function.

[Public | Private] [Static] Function имя [(списокАргументов)] [As тип]
	[инструкции]
	[имя = выражение]
	[Exit Function] 
	[инструкции]
	[имя = выражение]
End Function

Параметры
Public
Необязательный. Указывает, что процедура Function доступна для всех других процедур во всех модулях. При использовании в личном модуле (содержащем инструкцию Option Private) такая процедура недоступна вне проекта.
Private
Необязательный. Указывает, что процедура Function доступна для других процедур только того модуля, в котором она описана.
Static
Необязательный. Указывает, что локальные переменные процедуры Function сохраняются в промежутках времени между вызовами этой процедуры. Атрибут Static не действует на переменные, описанные вне процедуры Function, даже если они используются в этой процедуре.
имя
Обязательный. Имя процедуры Function, удовлетворяющее стандартным правилам именования переменных.
списокАргументов
Необязательный. Список переменных, представляющий аргументы, которые передаются в процедуру Function при ее вызове. Имена переменных разделяются запятой.

тип
Необязательный. Тип данных значения, возвращаемого процедурой Function, поддерживаются типы Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (в настоящее время не поддерживается), Date, String (за исключением строк фиксированной длины), Object, Variant или любой определяемый пользователем тип. Невозможен возврат массивов любого типа, однако допускается возврат значения типа Variant, содержащего массив.
инструкции
Необязательный. Любая группа инструкций, выполняемых внутри процедуры Function.
выражение
Необязательный. Возвращаемое значение процедуры Function.

Замечания
Процедуры Function, не описанные явно с помощью ключевых слов Public или Private, по умолчанию являются общими. Если не используется ключевое слово Static, значения локальных переменных не сохраняются между вызовами.
Допускаются рекурсивные процедуры Function; то есть они могут вызывать сами себя для выполнения определенных задач. Однако рекурсия может приводить к переполнению стека. Ключевое слово Static обычно не используется с рекурсивными процедурами Function.
Все выполняемые команды должны содержаться в процедурах. Не допускается определение процедуры Function внутри другой процедуры Function, Sub или Property.
Инструкция Exit Function приводит к немедленному выходу из процедуры Function. Выполнение программы продолжается с инструкции, следующей за инструкцией, в которой была вызвана процедура Function. В любом месте процедуры Function возможно наличие любого числа инструкций Exit Function.
Подобно процедуре Sub, процедура Function является самостоятельной процедурой, которая может получать аргументы, выполнять последовательность инструкций и изменять значения своих аргументов. Однако в отличие от процедуры Sub, когда требуется использовать возвращаемое функцией значение, процедура Function может применяться в правой части выражения, как и любая другая встроенная функция, например, Sqr, Cos или Chr.
Процедура Function вызывается в выражении по своему имени, за которым следует список аргументов в скобках. Для получения дополнительных сведений о вызовах процедур Function см. описание инструкции Call.
Для возврата значения из функции следует присвоить значение имени функции. Любое число таких инструкций присвоения может находиться в любом месте процедуры. Если имени процедуры не присваивается никакого значения, процедура возвращает значение по умолчанию: числовая функция возвращает нулевое значение, строковая функция возвращает значение пустой строки (""), а функция типа Variant возвращает значение Empty. Функция, которая возвращает ссылку на объект, возвращает значение Nothing, если внутри процедуры Function никакая ссылка на объект не присваивается имени функции с помощью инструкции Set.
В следующем примере демонстрируется присвоение возвращаемого значения функции BinarySearch. В этом случае имени присваивается значение False, чтобы указать, что некоторое значение не было найдено.

Function BinarySearch(. . .) As Boolean
. . .
	' Значение не найдено. Возвращается значение False.
	If lower > upper Then
		BinarySearch = False
		Exit Function
	End If
. . .
End Function

Переменные, используемые в процедурах Function, разбиваются на две категории: явно описанные внутри процедуры и не описанные внутри процедуры. Переменные, которые явно описаны в процедуре (с помощью ключевого слова Dim или эквивалентного ему), всегда являются локальными для этой процедуры. Переменные, которые используются, но явно не описаны в процедуре, также являются локальными, если они явно не описаны на более высоком уровне.
В процедуре допускается использование переменной, которая явно не описана в этой процедуре, но при этом может возникать конфликт имен, если на уровне модуля был определен элемент с тем же самым именем. Если в процедуре содержится ссылка на неописанную переменную, имя которой совпадает с именем другой процедуры, константы или переменной, то подразумевается, что процедура ссылается на это имя на уровне модуля. Чтобы избежать возникновения конфликтов такого рода, следует пользоваться явным описанием переменных. Для включения обязательного явного описания переменных используется инструкция Option Explicit.
В языке Visual Basic возможна реорганизация арифметических выражений для увеличения скорости их выполнения. Избегайте применения процедуры Function в арифметическом выражении, если эта процедура изменяет значения переменных, используемых в этом же выражении.

Пример
В данном примере инструкция Function используется для объявления имени, аргументов и кода, составляющих основу процедуры Function. В последнем примере используются инициализированные аргументы Optional с заданным типом.

' Следующая функция, определенная пользователем, возвращает
' квадратный корень из переданного ей аргумента.
Function CalculateSquareRoot(NumberArg As Double) As Double
	If NumberArg < 0 Then					' Анализирует аргумент.
		Exit Function					' Возврат в вызывающую
								' процедуру.
	Else
		CalculateSquareRoot = Sqr(NumberArg)			' Возвращает квадратный
								' корень.
	End If
End Function

Ключевое слово ParamArray позволяет функции принимать переменное число аргументов. В следующем описании FirstArg передается по значению.

Function CalcSum(ByVal FirstArg As Integer, ParamArray OtherArgs())
Dim ReturnValue 
' Если функция вызывается следующим образом:
ReturnValue = CalcSum(4, 3 ,2 ,1)
' Локальные переменные принимают следующие значения: FirstArg = 4,
' OtherArgs(1) = 3, OtherArgs(2) = 2 и т.п., если нижняя граница
' индексов массивов равняется 1.

Аргументы OptionalVariant.

' Если аргументы функции описаны следующим образом:
Function MyFunc(MyStr As String, Optional MyArg1 As _ Integer = 5, Optional MyArg2 = "Мария") 
Dim RetVal
' Функция может быть вызвана следующим образом:
RetVal = MyFunc("Всем", 2, "Привет")			' Указаны все 3 аргумента.
RetVal = MyFunc("Тест", , 5)			' Второй аргумент опущен.
						' Первый и третий аргументы(именованные аргументы).
RetVal = MyFunc(MyStr:="Привет ", MyArg1:=7)

Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.