Дополнительно
Как можно использовать необязательные параметры в C#?
Примечание: Этот вопрос был задан в то время, когда C# еще не поддерживал необязательные параметры (т.е. до C# 4).
Мы создаем веб-API, который программно генерируется из класса C#. Класс имеет метод GetFooBar(int a, int b)
, а API имеет метод GetFooBar
, принимающий параметры запроса типа &a=foo &b=bar
.
Классы должны поддерживать необязательные параметры, что не поддерживается в языке C#. Как лучше поступить?
455
20
Удивлен, никто не упомянул в C# 4.0 необязательные параметры, которые работают так:
Редактировать: я знаю, что в свое время был задан вопрос, в C# 4.0 не'т существуют. Но этот вопрос до сих пор занимает 1 место в Гугл и"на C# дополнительные аргументы" так я думал - этот ответ стоит здесь. К сожалению.
Другой вариант заключается в использовании ключевого слова params
Называется вроде...
В C# я бы обычно использовал несколько форм метода:
UPDATE: Упомянутое выше было способом, которым я использовал значения по умолчанию в C# 2.0. Проекты, над которыми я сейчас работаю, используют C# 4.0, который теперь напрямую поддерживает необязательные параметры. Вот пример, который я только что использовал в своем собственном коде:
С этого сайта:
http://www.tek-tips.com/viewthread.cfm?qid=1500861&page=1
C# действительно позволяет использовать атрибут [Optional] (из VB, хотя в C# он не функционирует). Таким образом, вы можете иметь метод, подобный этому:
В нашей обертке API мы определяем необязательные параметры (ParameterInfo p.IsOptional) и устанавливаем значение по умолчанию. Цель - пометить параметры как необязательные, не прибегая к таким уловкам, как наличие "optional" в имени параметра.
Вы можете использовать перегрузку методов...
Это зависит от сигнатур методов, в примере, который я привел, отсутствует только метод "int b", потому что он имеет ту же сигнатуру, что и метод "int a".
Вы можете использовать Nullable типы...
Затем с помощью a.HasValue можно проверить, был ли задан параметр.
Другим вариантом может быть использование параметра 'params'.
Если вы хотите использовать именованные параметры, то вам нужно будет создать тип для их обработки, хотя я думаю, что уже есть что-то подобное для веб-приложений.
Вы можете использовать необязательные параметры в C# 4.0 без каких-либо забот. Если у нас есть метод, как:
когда вы вызываете метод, вы можете пропускать параметров такой:
В C# 4.0 реализована функция под названием "параметры" и на самом деле можно передавать параметры по именам, и, конечно, вы можете передать параметры в любом порядке, какой вы хотите :)
Здравствуйте Факультативного Мира
Если вы хотите, чтобы во время выполнения, чтобы указать значение параметра по умолчанию, вам придется использовать отражение, чтобы сделать звонок. Не так хорошо, как другие предложения на этот вопрос, но совместимый с VB.NET.
Простой способ, который позволяет опускать параметры в любом положении, воспользовавшись типы, допускающие значения null следующим образом:
Струны уже типы, допускающие значение null, так что они Дон'т нужна ?.
Если у вас есть этот метод, следующие вызовы все действительные:
Когда вы определяете метод, таким образом, Вы имеете свободу для установки параметров, которые вы хотите по назначение их. См. следующую ссылку для получения дополнительной информации на именованные и необязательные параметры:
Именованные и необязательные аргументы (на C# руководство по программированию) @ на MSDN
Я согласен с stephenbayer. Но поскольку это веб-сервис, это проще для конечного пользователя, чтобы использовать только одну форму атрибутом webmethod, чем через несколько версий одного и того же метода. Я думаю в этой ситуации типы, допускающие значение null, идеально подходит для необязательных параметров.
необязательные параметры для методов. если вам нужны дополнительные аргументы для класса и вы:
класса MyClass { общественного класса MyClass(инт Мьинт = 1, строки mystring = на "Вау, это круто: я могу иметь строку с" умолчанию;) { // что-то делать здесь, если нужно } }
класса MyClass { общественного класса MyClass() { // это конструктор по умолчанию. }
общественного класса MyClass(инт Мьинт) : этот(минт, то "что-то") { // что-то делать здесь, если нужно } общественного класса MyClass(строки mystring) : это(0, например) { // что-то делать здесь, если нужно } общественного класса MyClass(инт Мьинт, строки mystring) { // что-то делать здесь, если нужно - это главный конструктор } }
Обычно это обрабатывается в C#, как Стивен упомянул, является перегрузка метода. Путем создания нескольких версий метода с разными параметрами вы эффективно создавать дополнительных параметров. В формы с меньшим количеством параметров, которые вы обычно называете форме метода с учетом всех параметров установка значений по умолчанию при вызове этого метода.
Используя перегрузок или с использованием C# 4.0 или выше
Вы можете перегружать ваш способ. Один способ содержит один параметр GetFooBar(инт а)
, а другой содержать оба параметра,
GetFooBar(в инт, инт б)`Немного опоздала на вечеринку, но я искал ответ на этот вопрос и в конечном итоге выяснил еще один способ сделать это. Объявлять типы данных для дополнительных параметрах веб-метод, чтобы быть XmlNode тип. Если необязательный аргумент опущен, это будет иметь значение null, и если это's в подарок вы можете получить строковое значение с помощью вызова арг.Значение, т. е.
Что's также приличный около этого подхода является .Чистая полученная Домашняя страница для WS еще показывает список аргументов (хотя вы теряете удобный ввод текста для тестирования).
Вместо параметров по умолчанию, почему бы просто не создать класс словарь из строки запроса прошло .. реализации, которое практически идентично тому, как asp.net формы работы с строки запросов.
т. е. запрос.Файл querystring["А"]
Это позволит отделить класс лист с завода / boilerplate кода.
Вы также можете проверить web-сервисов с ASP.NET. Веб-сервисы веб-API автоматически через атрибуты классов C#.
На всякий случай, если кто-то хочет передать функцию обратного вызова (или
делегат
) в качестве дополнительного параметра, можно сделать это так.Дополнительный параметр обратного вызова:
необязательные параметры не параметры по умолчанию! я предлагаю вам оба параметров по умолчанию. GetFooBar(тип int а=0, инт б=0), если вы Don'Т есть какие-либо перегруженный метод, приведет в=0, б=0, если вы Don'т пройти любые значения,если вы передаете значение 1, в результате, сдал значения, 0 и если бы вы пройти 2 значения 1-го назначается и второй B.
надеюсь, что ответил на ваш вопрос.
В случае, если значения по умолчанию не't доступный способ, чтобы добавить дополнительный параметр, чтобы использовать .Чистый класс OptionalAttribute - https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.optionalattribute?view=netframework-4.8
Пример кода ниже:
У меня есть веб-сервис написать, который принимает 7 параметров. Каждый является необязательным атрибутом запроса в SQL-оператор связалась с этим веб-сервисом. Так что два решения обязательные параметры приходят в голову... и довольно бедный:
метод1(параметр1, параметр2, параметр 3, параметр 4, 5 парам, парам 6, param7) метод1(параметр1, параметр param2, param3, парам 4, param5, параметр 6) Способ 1(параметр1, параметр param2, param3, param4, param5, param7)... начинаете видеть картину. Этот путь лежит безумие. Слишком много комбинаций.
Теперь по более простому пути, что выглядит неловко, но должен работать: метод1(параметр1, боол useParam1, параметр2, боол useParam2, и т. д...)
Что's один способ вызова требуемых значений для всех параметров, и он будет обрабатывать каждый случай внутри него. Это's также ясно, как использовать его из интерфейса.
Это'ы хак, но он будет работать.
Я должен был сделать это в VB.Net сервисы Web 2.0. Я в конечном итоге с указанием параметров в виде строк, а затем преобразовывать их, что мне нужно. Необязательный параметр задан пустой строкой. Не самое чистое решение, но это сработало. Только будьте осторожны, что вы поймать все исключения, которые могут произойти.