Примечание. Этот вопрос задавался в то время, когда C # еще не поддерживал необязательные параметры (т. Е. До C # 4).
Мы создаем веб-API, который программно генерируется из класса C #. У класса есть метод, GetFooBar(int a, int b)
а у API есть метод, GetFooBar
принимающий параметры запроса, такие как &a=foo &b=bar
.
Классы должны поддерживать необязательные параметры, которые не поддерживаются в языке C #. Какой лучший подход?
c#
optional-parameters
Kalid
источник
источник
Ответы:
Удивил никто не упомянул C # 4.0 необязательные параметры, которые работают так:
Редактировать: я знаю, что в то время, когда был задан вопрос, C # 4.0 не существовало. Но этот вопрос по-прежнему занимает № 1 в Google за «необязательные аргументы C #», поэтому я подумал - этот ответ стоит того, чтобы быть здесь. Сожалею.
источник
Другой вариант - использовать ключевое слово params.
Называется как ...
источник
public void log (params object[] args){ StringBuilder sb = new StringBuilder(); for (int i = 0; i < args.Length; i++){ sb.Append("{"); sb.Append(i.ToString()); sb.Append("}"); sb.Append(" "); } String.Format(sb.ToString(),args).Dump(); }
log("...Done,",(watch.ElapsedMilliseconds/1000).ToString(),"s");
В C # я обычно использовал бы несколько форм метода:
ОБНОВЛЕНИЕ: Это упомянутое выше БЫЛО способом, которым я сделал значения по умолчанию с C # 2.0. Проекты, над которыми я сейчас работаю, используют C # 4.0, который теперь напрямую поддерживает необязательные параметры. Вот пример, который я только что использовал в своем собственном коде:
источник
С этого сайта:
http://www.tek-tips.com/viewthread.cfm?qid=1500861&page=1
C # допускает использование атрибута [Необязательно] (из VB, хотя и не работает в C #). Таким образом, у вас может быть такой метод:
В нашей оболочке API мы определяем необязательные параметры (ParameterInfo p.IsOptional) и устанавливаем значение по умолчанию. Цель состоит в том, чтобы пометить параметры как необязательные, не прибегая к кладбищам, таким как наличие «необязательного» в имени параметра.
источник
Вы можете использовать метод перегрузки ...
Это зависит от сигнатур метода, в приведенном мною примере отсутствует метод «только b», поскольку он будет иметь такую же сигнатуру, что и метод «int a».
Вы можете использовать Nullable типы ...
Затем вы можете проверить, используя a.HasValue, чтобы увидеть, был ли установлен параметр.
Другой вариант - использовать параметр «params».
Если бы вы хотели использовать именованные параметры, нужно было бы создать тип для их обработки, хотя я думаю, что для веб-приложений уже есть нечто подобное.
источник
Вы можете использовать дополнительные параметры в C # 4.0 без каких-либо забот. Если у нас есть метод как:
когда вы вызываете метод, вы можете пропустить такие параметры:
В C # 4.0 реализована функция, называемая «именованные параметры», вы можете передавать параметры по их именам, и, конечно, вы можете передавать параметры в любом порядке :)
источник
Привет необязательный мир
Если вы хотите, чтобы среда выполнения предоставляла значение параметра по умолчанию, вы должны использовать отражение, чтобы сделать вызов. Не так приятно, как другие предложения по этому вопросу, но совместимо с VB.NET.
источник
Простой способ, позволяющий опускать любые параметры в любой позиции , - это использовать следующие типы :
Строки уже обнуляются, поэтому они не нужны ? ,
Если у вас есть этот метод, все следующие вызовы действительны :
Когда вы определяете метод таким образом, у вас есть свобода устанавливать только те параметры, которые вы хотите, называя их. Смотрите следующую ссылку для получения дополнительной информации об именованных и необязательных параметрах:
Именованные и необязательные аргументы (Руководство по программированию в C #) @ MSDN
источник
Я согласен со Стивенбайером. Но поскольку это веб-сервис, конечному пользователю проще использовать только одну форму веб-метода, чем использовать несколько версий одного и того же метода. Я думаю, что в этой ситуации Nullable Types идеально подходят для необязательных параметров.
источник
необязательные параметры для методов. если вам нужны необязательные аргументы для класса, и вы:
использование c # 4.0: использование необязательных аргументов в конструкторе класса, решение, которое я предпочитаю, поскольку оно ближе к тому, что делается с помощью методов, поэтому его легче запомнить. вот пример:
используя версии c #, предшествующие c # 4.0: вы должны использовать цепочку конструктора (используя ключевое слово: this), где более простые конструкторы приводят к «главному конструктору». пример:
источник
Типичный способ, которым это обрабатывается в C #, как упомянул Стивен, - перегрузить метод. Создавая несколько версий метода с различными параметрами, вы эффективно создаете необязательные параметры. В формах с меньшим количеством параметров вы обычно вызываете форму метода со всеми параметрами, устанавливающими значения по умолчанию при вызове этого метода.
источник
Вы можете перегрузить свой метод. Один метод содержит один параметр,
GetFooBar(int a)
а другой содержит оба параметра,GetFooBar(int a, int b)
источник
Использование перегрузок или использование C # 4.0 или выше
источник
Для большего количества необязательных параметров можно использовать один параметр Dictionary с методом ContainsKey. Мне нравится этот подход, потому что он позволяет мне передавать List или T по отдельности, не создавая совершенно другой метод (хорошо, если, например, параметры должны использоваться в качестве фильтров).
Пример (новый словарь <string, Object> () будет передан, если не требуются дополнительные параметры):
источник
Вместо параметров по умолчанию, почему бы просто не создать класс словаря из переданной строки запроса ... реализация, которая почти идентична тому, как формы asp.net работают со строками запроса.
т.е. Request.QueryString ["a"]
Это отделит класс листа от заводского / стандартного кода.
Вы также можете проверить веб-службы с ASP.NET . Веб-сервисы - это веб-API, генерируемые автоматически с помощью атрибутов классов C #.
источник
Немного опоздал на вечеринку, но я искал ответ на этот вопрос и в итоге придумал еще один способ сделать это. Объявите типы данных для необязательных аргументов вашего веб-метода как тип XmlNode. Если опциональный аргумент arg опущен, для него будет установлено значение null, а если он присутствует, вы можете получить строковое значение, вызвав arg.Value, т.е.
Что прилично в этом подходе, так это то, что сгенерированная .NET домашняя страница для ws по-прежнему показывает список аргументов (хотя вы теряете удобные поля ввода текста для тестирования).
источник
У меня есть веб-сервис для записи, который принимает 7 параметров. Каждый из них является необязательным атрибутом запроса для оператора SQL, заключенного в этот веб-сервис. Итак, на ум приходят два обходных пути к необязательным параметрам ... оба довольно плохие:
method1 (param1, param2, param 3, param 4, param 5, param 6, param7) method1 (param1, param2, param3, param 4, param5, param 6) метод 1 (param1, param2, param3, param4, param5, param7 ) ... начать видеть картинку. Этот путь лежит безумие. Слишком много комбинаций.
Теперь для более простого способа, который выглядит неудобно, но должен работать: method1 (param1, bool useParam1, param2, bool useParam2 и т. Д ...)
Это один вызов метода, требуются значения для всех параметров, и он будет обрабатывать каждый случай внутри него. Также понятно, как его использовать из интерфейса.
Это взлом, но это будет работать.
источник
Я должен был сделать это в веб-сервисе VB.Net 2.0. В итоге я указал параметры в виде строк, а затем преобразовал их в то, что мне было нужно. Необязательный параметр был указан с пустой строкой. Не самое чистое решение, но оно сработало. Просто будьте осторожны, чтобы вы поймали все исключения, которые могут произойти.
источник
На всякий случай, если кто-то хочет передать обратный вызов (или
delegate
) в качестве необязательного параметра, можете сделать это следующим образом.Необязательный параметр обратного вызова:
источник
необязательные параметры - это не что иное, как параметры по умолчанию! Я предлагаю вам дать оба параметра по умолчанию. GetFooBar (int a = 0, int b = 0), если у вас нет перегруженного метода, приведет к a = 0, b = 0, если вы не передадите никаких значений, если вы передадите 1 значение, приведет к , переданное значение для a, 0 и если вы передадите 2 значения, 1-е будет присвоено a, а второе - b.
Надеюсь это ответит на твой вопрос.
источник
Если значения по умолчанию недоступны, можно добавить необязательный параметр, используя класс .NET OptionalAttribute - https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.optionalattribute. ? вид = NetFramework-4,8
Пример кода ниже:
источник
Вы можете попробовать это тоже
Тип 1
public void YourMethod(int a=0, int b = 0) { //some code }
Тип 2
public void YourMethod(int? a, int? b) { //some code }
источник