Sub main что это
Передача аргументов по значению и по ссылке (Visual Basic)
Различия
При передаче аргумента в процедуру следует учитывать несколько различных различий, взаимодействующих друг с другом:
Является ли базовый программный элемент изменяемым или неизменяемым
Является ли сам аргумент изменяемым или неизменяемым
Передается ли аргумент по значению или по ссылке
Является ли тип данных аргумента типом значения или ссылочным типом
Возможность выбора механизма передачи
Необходимо тщательно выбрать механизм передачи для каждого аргумента.
Для ссылочных типов копируются только указатель на данные (четыре байта на 32-разрядных платформах, восемь байт на 64-разрядных платформах). Таким образом, можно передавать аргументы типа String или Object по значению без ущерба для производительности.
Определение механизма передачи
В объявлении процедуры указывается механизм передачи для каждого параметра. Вызывающий код не может переопределить ByVal механизм.
по умолчанию в Visual Basic передаются аргументы по значению.
Когда следует передавать аргумент по значению
Если вызывающий элемент кода, лежащий в основе аргумента, является неизменяемым элементом, объявите соответствующий параметр ByVal. Код не может изменять значение неизменяемого элемента.
Когда следует передавать аргумент по ссылке
Если процедуре требуется подлинное изменение базового элемента в вызывающем коде, объявите соответствующий параметр ByRef.
Пример
Описание
Оператор Sub (Visual Basic)
Объявляет имя, параметры и код, определяющие Sub процедуру.
Синтаксис
Компоненты
Необязательный элемент. См. список атрибутов.
Необязательный элемент. Указывает определение разделяемого метода. См. раздел разделяемые методы.
Необязательный элемент. Может применяться один из перечисленных ниже типов.
Необязательный элемент. Может применяться один из перечисленных ниже типов.
Необязательный элемент. См. раздел Shared.
Необязательный элемент. См. раздел Shadows.
Необязательный элемент. См. статью Async.
Обязательный элемент. Имя процедуры. См. раздел Declared Element Names. Чтобы создать процедуру конструктора для класса, задайте в качестве имени Sub процедуры New ключевое слово. Дополнительные сведения см. в разделе время существования объекта: как создаются и уничтожаются объекты.
Необязательный элемент. Список параметров типа для универсальной процедуры. См. список типов.
Необязательный элемент. Список имен локальных переменных, представляющих параметры этой процедуры. См. список параметров.
Необязательный элемент. Указывает, что эта процедура реализует одну или несколько Sub процедур, каждая из которых определена в интерфейсе, реализованном классом или структурой этой процедуры. См. инструкцию Implements.
Каждый элемент implementedprocedure имеет перечисленные ниже синтаксис и компоненты.
Необязательный элемент. Указывает, что эта процедура может управлять одним или несколькими конкретными событиями. См. раздел Handles.
Каждый элемент eventspecifier имеет перечисленные ниже синтаксис и компоненты.
Часть | Описание |
---|---|
eventvariable | Обязательный элемент. Объектная переменная, объявленная с типом данных класса или структуры, которая вызывает событие. |
event | Обязательный элемент. Имя события, обрабатываемого этой процедурой. |
Необязательный элемент. Блок инструкций для выполнения в рамках этой процедуры.
Завершает определение этой процедуры.
Комментарии
Весь исполняемый код должен находиться внутри процедуры. Используйте Sub процедуру, если не нужно возвращать значение в вызывающий код. Используйте Function процедуру, если требуется вернуть значение.
Определение подпроцедуры
Процедуру можно определить Sub только на уровне модуля. Контекст объявления для процедуры, следовательно, должен быть классом, структурой, модулем или интерфейсом и не может быть исходным файлом, пространством имен, процедурой или блоком. Дополнительные сведения см. в разделе Контексты объявления и уровни доступа по умолчанию.
Sub процедуры по умолчанию имеют открытый доступ. Уровни доступа можно изменить с помощью модификаторов доступа.
Возврат из подпроцедуры
Когда Sub процедура возвращается в вызывающий код, выполнение переходит к инструкции после оператора, вызвавшего ее.
В следующем примере показан возврат из Sub процедуры.
Exit Sub Операторы и Return вызывают немедленный выход из Sub процедуры. Любое количество Exit Sub инструкций и Return может использоваться в любом месте процедуры, и можно смешивать Exit Sub Return операторы и.
Вызов процедуры подпрограммы
Процедура вызывается с Sub помощью имени процедуры в инструкции и затем после этого имени вместе со списком аргументов в круглых скобках. Скобки можно опустить, только если не указаны аргументы. Однако код является более удобочитаемым, если всегда включать круглые скобки.
Sub Процедура и Function процедура могут иметь параметры и выполнять ряд инструкций. Однако Function процедура возвращает значение, а Sub процедура — нет. Поэтому нельзя использовать Sub процедуру в выражении.
Call Ключевое слово можно использовать при вызове Sub процедуры, но это ключевое слово не рекомендуется для большинства случаев использования. Дополнительные сведения см. в разделе оператор Call.
Visual Basic иногда переупорядочивает арифметические выражения для повышения внутренней эффективности. По этой причине, если список аргументов содержит выражения, вызывающие другие процедуры, не следует рассчитывать на то, что эти выражения будут вызываться в определенном порядке.
Процедуры Async
С помощью функции Async можно вызывать асинхронные функции без использования явных обратных вызовов или вручную разделить код по нескольким функциям или лямбда-выражениям.
Async Процедура возвращается к вызывающему объекту, когда происходит либо первый ожидающий объект, который еще не завершен, либо Async достигнут конец процедуры, в зависимости от того, что произойдет раньше.
Async«Sub процедуры в основном используются для обработчиков событий, где значение не может быть возвращено. Async Sub Процедуру нельзя ожидать, и вызывающая Async Sub процедура не может перехватывать исключения, которые Sub создает процедура.
Пример 1
В следующем примере оператор используется Sub для определения имени, параметров и кода, образующих тело Sub процедуры.
Пример 2
Sub main что это
Методы представляют собой набор операторов, предназначенных для выполнения определенного действия. Методы условно можно разделить на два типа: процедуры и функции. Если процедуры просто выполняют определенные действия, то функции возвращают некоторое значение.
Использование методов в программе
Чтобы вызвать метод в программе, надо указать имя метода, а после него в скобках значения для его параметров:
Обратите внимание, что поскольку функция возвращает значение, это значение можно присвоить другой переменной.
Передача параметров
Передача параметров по ссылке происходит также, только вместо ByVal используется ключевое слово ByRef :
В чем же отличие передачи аргумента по ссылке от передачи по значению? При передаче аргумента по значению метод получает не саму переменную, а ее копию. При передаче аргумента по ссылке в метод передается адрес этой переменной в памяти. И если в методе изменяется значение такой аргумента, то также изменяется и значение переменной, которая передается на его место:
Когда же надо передавать аргументы по ссылке, а когда по значению? Если необходимо изменить переменную или даже несколько переменных в одном методе, то следует передавать аргументы по ссылке. Также следует передавать по ссылке большие объекты, даже если не надо их изменять, поскольку создание их копии снижает производительность программы.
Необязательные параметры
Тогда при вызове этой функции мы можем не передавать значения для двух последних параметров:
Передача аргументов по имени
В предыдущих примерах мы передавали значения для параметров в порядке объявления этих параметров в методе. Однако можно также передавать значения для параметров по имени. При этом порядок передачи значений не зависит от порядка следования параметров. Для этого в вызове метода мы указываем имя параметра, потом двоеточие и знак равенства и затем значение для этого параметра. К примеру, передадим значения для параметров к вышеопределенной функции Add :
Рекурсивные функции
Итак, у нас в данном случае задается условие, что если вводимое число не равно 1, то мы умножаем данное число на результат этой же функции, в которую в качестве параметра передается число x-1. И так, пока не дойдем того момента, когда значение параметра не будет равно единице.
Еще одним примером рекурсивной функции может служить функция для вычисления числа Фибоначчи. n-й член последовательности Фибоначчи определяется по формуле: f(n)=f(n-1) + f(n-2), причем f(0)=0, f(1)=1.
Вызов процедур Sub и Function
Чтобы вызвать процедуру Sub из другой процедуры, введите имя процедуры и включите значения для всех требуемых аргументов. Оператор Call не является обязательным, но в случае его использования вам следует заключить все аргументы в скобки.
Хотите создавать решения, которые расширяют возможности Office на разнообразных платформах? Ознакомьтесь с новой моделью надстроек Office. Надстройки Office занимают меньше места по сравнению с надстройками и решениями VSTO, и вы можете создавать их, используя практически любую технологию веб-программирования, например HTML5, JavaScript, CSS3 и XML.
Вызов процедур Sub с несколькими аргументами
В приведенном ниже примере показано два способа для вызова процедуры Sub с несколькими аргументами. При втором вызове аргументы должны быть заключены в скобки, так как используется оператор Call.
Использование круглых скобок при вызове процедур функций
Чтобы использовать возвращаемое значение функции, назначьте ее переменной, и заключите аргументы в скобки, как показано в следующем примере.
Если возвращаемое значение функции вас не интересует, можно вызвать функцию тем же способом, что и процедуру Sub. Опустите скобки, укажите аргументы и не назначайте функцию переменной, как показано в следующем примере.
Если включить скобки в предыдущий пример, оператор вызывает ошибку синтаксиса.
Передача именованных аргументов
Оператор в процедуре Sub или Function может передавать значения в вызываемые процедуры с помощью именованных аргументов. Вы можете указывать именованные аргументы в любом порядке. Именованный аргумент состоит из имени аргумента, за которым стоит двоеточие и знак равенства (:=), а затем следует присвоенное аргументу значение.
В примере ниже функция MsgBox вызывается с использованием именованных аргументов без возвращаемого значения.
В примере ниже функция MsgBox вызывается с использованием именованных аргументов. Возвращаемое значение присваивается переменной.
См. также
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Оператор Function (Visual Basic)
Объявляет имя, параметры и код, определяющие Function процедуру.
Синтаксис
Компоненты
Необязательный элемент. См. список атрибутов.
Необязательный элемент. Может применяться один из перечисленных ниже типов.
Необязательный элемент. Может применяться один из перечисленных ниже типов.
Необязательный элемент. См. раздел Shared.
Необязательный элемент. См. раздел Shadows.
Необязательный элемент. См. статью Async.
Необязательный элемент. См. итератор.
Обязательный элемент. Имя процедуры. См. раздел Declared Element Names.
Необязательный элемент. Список параметров типа для универсальной процедуры. См. список типов.
Необязательный элемент. Список имен локальных переменных, представляющих параметры этой процедуры. См. список параметров.
Необязательный элемент. Указывает, что эта процедура реализует одну или несколько Function процедур, каждая из которых определена в интерфейсе, реализованном классом или структурой этой процедуры. См. инструкцию Implements.
Каждый элемент implementedprocedure имеет перечисленные ниже синтаксис и компоненты.
Необязательный элемент. Указывает, что эта процедура может управлять одним или несколькими конкретными событиями. См. раздел Handles.
Каждый элемент eventspecifier имеет перечисленные ниже синтаксис и компоненты.
Часть | Описание |
---|---|
eventvariable | Обязательный элемент. Объектная переменная, объявленная с типом данных класса или структуры, которая вызывает событие. |
event | Обязательный элемент. Имя события, обрабатываемого этой процедурой. |
Необязательный элемент. Блок инструкций для выполнения в рамках этой процедуры.
Завершает определение этой процедуры.
Комментарии
Весь исполняемый код должен находиться внутри процедуры. Каждая процедура, в свою очередь, объявляется в классе, структуре или модуле, который называется содержащим классом, структурой или модулем.
Чтобы вернуть значение в вызывающий код, используйте Function процедуру; в противном случае используйте Sub процедуру.
Определение функции
Процедуру можно определить Function только на уровне модуля. Таким образом, контекст объявления для функции должен быть классом, структурой, модулем или интерфейсом и не может быть исходным файлом, пространством имен, процедурой или блоком. Дополнительные сведения см. в разделе Контексты объявления и уровни доступа по умолчанию.
Function процедуры по умолчанию имеют открытый доступ. Уровни доступа можно изменить с помощью модификаторов доступа.
Лямбда-выражения можно использовать для определения выражений функций встроенным. Дополнительные сведения см. в разделе выражение функции и лямбда-выражения.
Возврат из функции
Когда Function процедура возвращается в вызывающий код, выполнение переходит к инструкции, следующей за инструкцией, вызвавшей процедуру.
Чтобы вернуть значение из функции, можно либо присвоить значение имени функции, либо включить его в Return инструкцию.
Return Оператор одновременно назначает возвращаемое значение и завершает функцию, как показано в следующем примере.
Exit Function Операторы и Return вызывают немедленный выход из Function процедуры. Любое количество Exit Function инструкций и Return может использоваться в любом месте процедуры, и можно смешивать Exit Function Return операторы и.
Вызов функции
Процедура вызывается с Function использованием имени процедуры, за которым следует список аргументов в выражении в круглых скобках. Скобки можно опустить, только если вы не предоставляете никаких аргументов. Однако код является более удобочитаемым, если всегда включать круглые скобки.
Функцию можно также вызвать с помощью Call ключевого слова. В этом случае возвращаемое значение игнорируется. Call В большинстве случаев использование ключевого слова не рекомендуется. Дополнительные сведения см. в разделе оператор Call.
Visual Basic иногда переупорядочивает арифметические выражения для повышения внутренней эффективности. По этой причине не следует использовать Function процедуру в арифметическом выражении, если функция изменяет значение переменных в том же выражении.
Асинхронные функции
Функция Async позволяет вызывать асинхронные функции без использования явных обратных вызовов или вручную разделять код между несколькими функциями или лямбда-выражениями.
Async Процедура возвращается к вызывающему объекту, когда он встречает первый ожидающий объект, который еще не завершен, или на конец процедуры, в зависимости от того, что Async происходит раньше.
Оператор подвыражения также может быть помечен Async модификатором. Это в основном используется для обработчиков событий, где значение не может быть возвращено. Async Sub Процедуру нельзя ожидать, и вызывающая Async Sub процедура не может перехватывать исключения, создаваемые Sub процедурой.
Функции итератора
Функция итератора выполняет настраиваемую итерацию для коллекции, например списка или массива. Функция итератора использует оператор yield для возвращения каждого элемента по одному за раз. При достижении оператора yield текущее расположение в коде запоминается. При следующем вызове функции итератора выполнение возобновляется с этого места.
Итератор вызывается из клиентского кода с помощью метода For Each. Следующий оператор.
Дополнительные сведения см. в разделе Итераторы.
Пример 1
В следующем примере оператор используется Function для объявления имени, параметров и кода, образующих тело Function процедуры. ParamArray Модификатор позволяет функции принимать переменное число аргументов.
Пример 2
В следующем примере вызывается функция, объявленная в предыдущем примере.