c необязательные параметры в методе
Необязательные и именованные аргументы
Необязательные аргументы
В версии C# 4.0 внедрено новое средство, повышающее удобство указания аргументов при вызове метода. Это средство называется необязательными аргументами и позволяет определить используемое по умолчанию значение для параметра метода. Данное значение будет использоваться по умолчанию в том случае, если для параметра не указан соответствующий аргумент при вызове метода. Следовательно, указывать аргумент для такого параметра не обязательно. Необязательные аргументы позволяют упростить вызов методов, где к некоторым параметрам применяются аргументы, выбираемые по умолчанию. Их можно также использовать в качестве «сокращенной» формы перегрузки методов.
Главным стимулом для добавления необязательных аргументов послужила необходимость в упрощении взаимодействия с объектами СОМ. В нескольких объектных моделях Microsoft (например, Microsoft Office) функциональность предоставляется через объекты СОМ, многие из которых были написаны давно и рассчитаны на использование необязательных параметров.
Пример использования необязательных аргументов показан ниже:
Следует иметь в виду, что все необязательные аргументы должны непременно указываться справа от обязательных. Помимо методов, необязательные аргументы можно применять в конструкторах, индексаторах и делегатах.
Преимущество необязательных аргументов заключается, в частности, в том, что они упрощают программирующему обращение со сложными вызовами методов и конструкторов. Ведь нередко в методе приходится задавать больше параметров, чем обычно требуется. И в подобных случаях некоторые из этих параметров могут быть сделаны необязательными благодаря аккуратному применению необязательных аргументов. Это означает, что передавать нужно лишь те аргументы, которые важны в данном конкретном случае, а не все аргументы, которые в противном случае должны быть обязательными. Такой подход позволяет рационализировать метод и упростить программирующему обращение с ним.
Именованные аргументы
Данное ограничение призваны преодолеть именованные аргументы. Именованный аргумент позволяет указать имя того параметра, которому присваивается его значение. И в этом случае порядок следования аргументов уже не имеет никакого значения. Таким образом, именованные аргументы в какой-то степени похожи на упоминавшиеся ранее инициализаторы объектов, хотя и отличаются от них своим синтаксисом. Для указания аргумента по имени служит следующая форма синтаксиса:
Здесь имя_параметра обозначает имя того параметра, которому передается значение. Разумеется, имя_параметра должно обозначать имя действительного параметра для вызываемого метода.
Так же, как и необязательные аргументы, именованные аргументы можно использовать помимо методов, в конструкторах, индексаторах или делегатах.
Синтаксис именованных аргументов более многословен, чем у обычных позиционных аргументов, и поэтому для вызова методов чаще всего применяются позиционные аргументы. Но в тех случаях, когда это уместно, именованные аргументы могут быть использованы довольно эффективно.
Урок №103. Параметры по умолчанию
Обновл. 13 Сен 2021 |
На этом уроке мы рассмотрим, что такое параметры по умолчанию в языке С++ и то, как их использовать.
Параметры по умолчанию
Параметр по умолчанию (или «необязательный параметр») — это параметр функции, который имеет определенное (по умолчанию) значение. Если пользователь не передает в функцию значение для параметра, то используется значение по умолчанию. Если же пользователь передает значение, то это значение используется вместо значения по умолчанию. Например:
Результат выполнение программы:
Параметр по умолчанию — это отличный вариант, когда функция нуждается в значении, которое пользователь может переопределить, а может и не переопределить. Например, вот несколько прототипов функций, для которых могут использоваться параметры по умолчанию:
Несколько параметров по умолчанию
Функция может иметь несколько параметров по умолчанию:
При следующих вызовах функции:
Values: 3 4 5
Values: 3 4 12
Values: 3 11 12
Values: 10 11 12
Правило №1: Все параметры по умолчанию в прототипе или в определении функции должны находиться справа. Следующее вызовет ошибку:
Правило №2: Если имеется более одного параметра по умолчанию, то самым левым параметром по умолчанию должен быть тот, который с наибольшей вероятностью (среди всех остальных параметров) будет явно переопределен пользователем.
Объявление параметров по умолчанию
Как только параметр по умолчанию объявлен, повторно объявить его уже нельзя. Это значит, что для функции с предварительным объявлением и определением, параметр по умолчанию объявить можно либо в предварительном объявлении, либо в определении функции, но не в обоих местах сразу. Например:
Именованные и необязательные аргументы (Руководство по программированию на C#)
C# 4 вводит именованные и необязательные аргументы. Именованные аргументы позволяют указать аргумент для параметра, связав этот аргумент с именем параметра, а не с его позицией в списке параметров. Необязательные аргументы позволяют опускать аргументы для некоторых параметров. Оба варианта можно использовать с методами, индексаторами, конструкторами и делегатами.
При использовании именованных и необязательных аргументов аргументы оцениваются в том порядке, в котором они отображаются в списке аргументов, а не в списке параметров.
Именованные и дополнительные параметры позволяют указать аргументы для выбранных параметров. Эта возможность значительно упрощает вызов интерфейсов COM, таких как API автоматизации Microsoft Office.
Именованные аргументы
Именованные аргументы освобождают вас от необходимости сопоставлять порядок параметров в списках параметров вызванных методов. Параметр для каждого аргумента можно указать, используя имя параметра. Например, функция, которая выводит сведения о заказе (имя продавца, номер заказа и наименование товара и т. д.), может вызываться путем передачи аргументов по позиции в порядке, определяемом функцией.
Если вы не помните порядок параметров, но знаете их имена, можете передать аргументы в любом порядке.
Именованные аргументы при использовании с позиционными аргументами допустимы при условии, что
за ними не следуют позиционные аргументы, либо,
начиная с C# 7.2, они используются в правильной позиции. В примере ниже параметр orderNum находится в правильной позиции, но не имеет явно заданного имени.
Позиционные аргументы после внеочередных именованных аргументов недопустимы.
Пример
Приведенный ниже код реализует как примеры из этого раздела, так и некоторые дополнительные примеры.
Необязательные аргументы
Определение метода, конструктора, индексатора или делегата может указывать, являются его параметры обязательными или нет. Любой вызов должен содержать аргументы для всех обязательных параметров; аргументы для необязательных параметров можно опустить.
Определение каждого необязательного параметра содержит его значение по умолчанию. Если аргумент для параметра не передается, используется значение по умолчанию. Значением по умолчанию должен быть один из следующих типов выражений:
Необязательные параметры определяются в конце списка параметров после всех обязательных параметров. Если вызывающий объект предоставляет аргумент для любого из последующих необязательных параметров, он должен содержать аргументы для всех предыдущих необязательных параметров. Пробелы, разделенные запятыми, в списке аргументов не поддерживаются. Например, в следующем коде метод экземпляра ExampleMethod определяется одним обязательным и двумя необязательными параметрами.
Следующий вызов ExampleMethod вызывает ошибку компилятора, поскольку аргумент предоставляется для третьего параметра, но не для второго.
Если вы знаете имя третьего параметра, можете использовать для выполнения задачи именованный аргумент.
В IntelliSense необязательные параметры заключаются в квадратные скобки, как показано на следующем рисунке:
Пример
Приведенный выше код выводит число примеров с некорректно примененными необязательными параметрами. Первый пример демонстрирует, что для первого параметра (обязательный) необходимо указать аргумент.
интерфейсы COM
Именованные и необязательные аргументы, а также поддержка динамических объектов значительно улучшают взаимодействие с API COM, такими как API автоматизации Office.
Например, метод AutoFormatв интерфейсе Microsoft Office Excel Range имеет семь параметров и все они необязательные. Эти параметры показаны на следующем рисунке:
В C# 3.0 и более ранних версиях аргумент необходимо указывать для каждого параметра, как показано в следующем примере.
При этом вызов AutoFormat можно значительно упростить, используя именованные и необязательные аргументы, представленные в C# 4.0. Именованные и необязательные аргументы позволяют опускать аргументы для необязательных параметров, если значение параметра по умолчанию менять не нужно. В следующем вызове значение задается только для одного из семи параметров.
Разрешение перегрузки
Использование именованных и необязательных аргументов влияет на разрешение перегрузки описанным ниже образом.
Спецификация языка C#
Дополнительные сведения см. в спецификации языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.
Необязательные параметры и именованные аргументы в C#4
Сегодняшний пост затронет тему новых возможностей языка, добавленных в C# 4.0 – необязательные параметры и именованные аргументы, а еще крутой способ использования необязательных параметров в ASP.NET MVC 2.
Необязательные параметры
C# 4.0 поддерживает необязательные параметры в методах, конструкторах и индексаторах (VB умел такое уже давным-давно).
Параметры являются необязательными, когда присутствует в объявлении значение по умолчанию. Например, ниже представлен метод, который принимает два параметра: строковый параметр “category” и целочисленный “pageIndex”. Параметр “pageIndex” имеет значение по умолчанию равное 0 и поэтому является необязательным параметром:
Когда вызываете выше приведенный метод, то мы можем передать явно два параметра:
Или же опустить второй необязательный параметр, в данном случае будет передано значение по умолчанию 0:
Обратите внимание, IntelliSense в VS 2010 указывает, что параметр является необязательным, а также его значение по умолчанию:
Именованные аргументы и необязательные параметры в C# 4.0
C# 4.0 также поддерживает концепцию именованных параметров. Что позволяет явно указывать имя передаваемого в метод параметра, вместо идентификации его по положению.
Например, я могу написать код, как показано ниже, явно определяя второй аргумент в метод GetProductsByCategory по имени:
Именованные аргументы достаточно удобны, когда метод поддерживает несколько необязательным параметров и вы хотите явно указать, какие аргументы передать. Например, ниже, у нас есть метод DoSomething, которые принимает два необязательных параметра:
Мы можем использовать именованные аргументы для вызова метода любым перечисленным способом:
Так как оба параметра являются необязательными, и в случае когда указывается один или ноль аргументов, передается значение по умолчанию для не указанного аргумента.
ASP.NET MVC 2 и необязательные параметры
Давайте рассмотрим один интересный сценарий, когда мы можем использовать необязательные параметры в ASP.NET MVC 2 связи с методами действий в классах контроллерах.
Например, мы хотим привязать такие URL-адреса, как “Products/Browse/Beverages” или “Products/Browse/Deserts” к методу действия контроллера. Мы можем реализовать это написав URL-маршрутизатор, который связывает URL-адреса с методом:
Мы можем и использовать значение необязательного параметра строки запроса “page”, а можем и проигнорировать его, для отображения результата метода Browse, которое выводит результат по страницам. Например, /Products/Browse/Beverages?page=2.
В ASP.NET MVC 1 вы, как обычно, обрабатывали данный сценарий добавив в метод действия параметр “page” и установив ему значение null (если параметр “page” не будет присутствовать в строке запроса, то будет передан null). Далее вы можете написать код, конвертирующий null в int и присвоить его значению по умолчанию, если не был передан в строку запроса:
C ASP.NET MVC 2 вы можете использовать необязательные параметры, поддерживаемые в VB и C#для более короткой и четкой реализации. Достаточно объявить параметр метода действия, как необязательный с значением по умолчанию:
Если значение “page” присутствует в строке запроса (/Products/Browse/Beverages?page=22), тогда оно будет передано в метод действия, как целое число. Если же значение “page” отсутствует в строке запроса (/Products/Browse/Beverages), тогда в метод действия будет передано значение по умолчанию, равное 0. Что делает код немного более сжатым и читабельным.
Итоги
Появилось довольно много новых возможностей в C# и VB. Вышеописанные две всего лишь малая часть из них.
Ключевые слова in, out и ref в методах C#
Зачем нужны ключевые слова in, out и ref?
Теперь вызовем наш метод в основной программе, например, вот так:
Что выведет на экран наша программа. Смотрим:
Передача параметров по ссылке. Ключевое слово ref
Ключевое слово ref позволяет передавать аргумент (параметр) по ссылке, а не по значению. Если мы передаем параметр по ссылке, то этот параметр (переменную) можно изменить внутри метода, например, перепишем наш метод Addition :
Теперь результат работы программы будет следующий:
Результат выполнения метода: 6. Значение переменной после выполнения метода: 6
Как видите, передача параметра по ссылке позволяет изменять значение переменной в теле метода.
Передача параметров по ссылке. Ключевое слово out
то компилятор сообщит нам об ошибке:
так как переменная b объявлена не не инициализирована. С ключевым словом out инициализацию переменной можно не проводить перед её передачей в метод и вот такой код не вызовет ошибки:
Передача параметров по ссылке. Ключевое слово in
Необязательные параметры в методах
До сих пор мы использовали в описании методов параметры, которые обязательно было передавать при вызове метода. Однако, C# позволяет также определять в методах необязательные параметры, которые по умолчанию имеют какое-то значение, например, объявим в нашем метода Addition необязательный параметр — значение на которое необходимо увеличить переменную:
В вызове метода мы можем не указывать параметр d и при его использовании в теле метода он будет равен 1:
А можем вызвать метод вот так:
Именованные параметры
По умолчанию в C# параметры в методы должны передаваться ровно в том порядке, в котором они стоят в описании метода. Однако, используя именованные параметры мы можем нарушить порядок по умолчанию, вызвав метод, например, вот так:


