Как можно использовать необязательные параметры в C#?

Примечание: Этот вопрос был задан в то время, когда C# еще не поддерживал необязательные параметры (т.е. до C# 4).

Мы создаем веб-API, который программно генерируется из класса C#. Класс имеет метод GetFooBar(int a, int b), а API имеет метод GetFooBar, принимающий параметры запроса типа &a=foo &b=bar.

Классы должны поддерживать необязательные параметры, что не поддерживается в языке C#. Как лучше поступить?

Комментарии к вопросу (1)
Решение

Удивлен, никто не упомянул в C# 4.0 необязательные параметры, которые работают так:

public void SomeMethod(int a, int b = 0)
{
   //some code
}

Редактировать: я знаю, что в свое время был задан вопрос, в C# 4.0 не'т существуют. Но этот вопрос до сих пор занимает 1 место в Гугл и"на C# дополнительные аргументы" так я думал - этот ответ стоит здесь. К сожалению.

Комментарии (8)

Другой вариант заключается в использовании ключевого слова params

public void DoSomething(params object[] theObjects)
{
  foreach(object o in theObjects)
  {
    // Something with the Objects…
  }
}

Называется вроде...

DoSomething(this, that, theOther);
Комментарии (2)

В C# я бы обычно использовал несколько форм метода:

void GetFooBar(int a) { int defaultBValue;  GetFooBar(a, defaultBValue); }
void GetFooBar(int a, int b)
{
 // whatever here
}

UPDATE: Упомянутое выше было способом, которым я использовал значения по умолчанию в C# 2.0. Проекты, над которыми я сейчас работаю, используют C# 4.0, который теперь напрямую поддерживает необязательные параметры. Вот пример, который я только что использовал в своем собственном коде:

public EDIDocument ApplyEDIEnvelop(EDIVanInfo sender, 
                                   EDIVanInfo receiver, 
                                   EDIDocumentInfo info,
                                   EDIDocumentType type 
                                     = new EDIDocumentType(EDIDocTypes.X12_814),
                                   bool Production = false)
{
   // My code is here
}
Комментарии (2)

С этого сайта:

http://www.tek-tips.com/viewthread.cfm?qid=1500861&page=1

C# действительно позволяет использовать атрибут [Optional] (из VB, хотя в C# он не функционирует). Таким образом, вы можете иметь метод, подобный этому:

using System.Runtime.InteropServices;
public void Foo(int a, int b, [Optional] int c)
{
  ...
}

В нашей обертке API мы определяем необязательные параметры (ParameterInfo p.IsOptional) и устанавливаем значение по умолчанию. Цель - пометить параметры как необязательные, не прибегая к таким уловкам, как наличие "optional" в имени параметра.

Комментарии (4)

Вы можете использовать перегрузку методов...

GetFooBar()
GetFooBar(int a)
GetFooBar(int a, int b)

Это зависит от сигнатур методов, в примере, который я привел, отсутствует только метод "int b", потому что он имеет ту же сигнатуру, что и метод "int a".

Вы можете использовать Nullable типы...

GetFooBar(int? a, int? b)

Затем с помощью a.HasValue можно проверить, был ли задан параметр.

Другим вариантом может быть использование параметра 'params'.

GetFooBar(params object[] args)

Если вы хотите использовать именованные параметры, то вам нужно будет создать тип для их обработки, хотя я думаю, что уже есть что-то подобное для веб-приложений.

Комментарии (0)

Вы можете использовать необязательные параметры в C# 4.0 без каких-либо забот. Если у нас есть метод, как:

int MyMetod(int param1, int param2, int param3=10, int param4=20){....}

когда вы вызываете метод, вы можете пропускать параметров такой:

int variab = MyMethod(param3:50; param1:10);

В C# 4.0 реализована функция под названием "параметры" и на самом деле можно передавать параметры по именам, и, конечно, вы можете передать параметры в любом порядке, какой вы хотите :)

Комментарии (0)

Здравствуйте Факультативного Мира

Если вы хотите, чтобы во время выполнения, чтобы указать значение параметра по умолчанию, вам придется использовать отражение, чтобы сделать звонок. Не так хорошо, как другие предложения на этот вопрос, но совместимый с VB.NET.

using System;
using System.Runtime.InteropServices;
using System.Reflection;

namespace ConsoleApplication1
{
    class Class1
    {
        public static void sayHelloTo(
            [Optional,
            DefaultParameterValue("world")] string whom)
        {
            Console.WriteLine("Hello " + whom);
        }

        [STAThread]
        static void Main(string[] args)
        {
            MethodInfo mi = typeof(Class1).GetMethod("sayHelloTo");
            mi.Invoke(null, new Object[] { Missing.Value });
        }
    }
}
Комментарии (0)

Простой способ, который позволяет опускать параметры в любом положении, воспользовавшись типы, допускающие значения null следующим образом:

public void PrintValues(int? a = null, int? b = null, float? c = null, string s = "")
{
    if(a.HasValue)
        Console.Write(a);
    else
        Console.Write("-");

    if(b.HasValue)
        Console.Write(b);
    else
        Console.Write("-");

    if(c.HasValue)
        Console.Write(c);
    else
        Console.Write("-");

    if(string.IsNullOrEmpty(s)) // Different check for strings
        Console.Write(s);
    else
        Console.Write("-");
}

Струны уже типы, допускающие значение null, так что они Дон'т нужна ?.

Если у вас есть этот метод, следующие вызовы все действительные:

PrintValues (1, 2, 2.2f);
PrintValues (1, c: 1.2f);
PrintValues(b:100);
PrintValues (c: 1.2f, s: "hello");
PrintValues();

Когда вы определяете метод, таким образом, Вы имеете свободу для установки параметров, которые вы хотите по назначение их. См. следующую ссылку для получения дополнительной информации на именованные и необязательные параметры:

Именованные и необязательные аргументы (на C# руководство по программированию) @ на MSDN

Комментарии (0)

Я согласен с stephenbayer. Но поскольку это веб-сервис, это проще для конечного пользователя, чтобы использовать только одну форму атрибутом webmethod, чем через несколько версий одного и того же метода. Я думаю в этой ситуации типы, допускающие значение null, идеально подходит для необязательных параметров.

public void Foo(int a, int b, int? c)
{
  if(c.HasValue)
  {
    // do something with a,b and c
  }
  else
  {
    // do something with a and b only
  }  
}
Комментарии (1)

необязательные параметры для методов. если вам нужны дополнительные аргументы для класса и вы:

  • с использованием C# 4.0: использование необязательных аргументов в конструкторе класса, решения я предпочитаю, поскольку это'ы ближе к тому, что делается с методами, так легче запомнить. здесь'ы пример:

класса MyClass { общественного класса MyClass(инт Мьинт = 1, строки mystring = на "Вау, это круто: я могу иметь строку с&quot умолчанию;) { // что-то делать здесь, если нужно } }

  • с использованием C# версий в C#4.0: вы должны использовать конструктор сцепления (с помощью :этого сайта), где проще конструкторы привести к "Мои мастер конструктор" по. пример:

класса MyClass { общественного класса MyClass() { // это конструктор по умолчанию. }

общественного класса MyClass(инт Мьинт) : этот(минт, то "что-то") { // что-то делать здесь, если нужно } общественного класса MyClass(строки mystring) : это(0, например) { // что-то делать здесь, если нужно } общественного класса MyClass(инт Мьинт, строки mystring) { // что-то делать здесь, если нужно - это главный конструктор } }

Комментарии (0)

Обычно это обрабатывается в C#, как Стивен упомянул, является перегрузка метода. Путем создания нескольких версий метода с разными параметрами вы эффективно создавать дополнительных параметров. В формы с меньшим количеством параметров, которые вы обычно называете форме метода с учетом всех параметров установка значений по умолчанию при вызове этого метода.

Комментарии (0)

Используя перегрузок или с использованием C# 4.0 или выше

 private void GetVal(string sName, int sRoll)
 {
   if (sRoll > 0)
   {
    // do some work
   }
 }

 private void GetVal(string sName)
 {
    GetVal("testing", 0);
 }
Комментарии (0)

Вы можете перегружать ваш способ. Один способ содержит один параметр GetFooBar(инт а), а другой содержать оба параметра,GetFooBar(в инт, инт б)`

Комментарии (0)

Немного опоздала на вечеринку, но я искал ответ на этот вопрос и в конечном итоге выяснил еще один способ сделать это. Объявлять типы данных для дополнительных параметрах веб-метод, чтобы быть XmlNode тип. Если необязательный аргумент опущен, это будет иметь значение null, и если это's в подарок вы можете получить строковое значение с помощью вызова арг.Значение, т. е.

[WebMethod]
public string Foo(string arg1, XmlNode optarg2)
{
    string arg2 = "";
    if (optarg2 != null)
    {
        arg2 = optarg2.Value;
    }
    ... etc
}

Что's также приличный около этого подхода является .Чистая полученная Домашняя страница для WS еще показывает список аргументов (хотя вы теряете удобный ввод текста для тестирования).

Комментарии (1)

Вместо параметров по умолчанию, почему бы просто не создать класс словарь из строки запроса прошло .. реализации, которое практически идентично тому, как asp.net формы работы с строки запросов.

т. е. запрос.Файл querystring["А"]

Это позволит отделить класс лист с завода / boilerplate кода.


Вы также можете проверить web-сервисов с ASP.NET. Веб-сервисы веб-API автоматически через атрибуты классов C#.

Комментарии (0)

На всякий случай, если кто-то хочет передать функцию обратного вызова (или делегат) в качестве дополнительного параметра, можно сделать это так.

Дополнительный параметр обратного вызова:

public static bool IsOnlyOneElement(this IList lst, Action callbackOnTrue = (Action)((null)), Action callbackOnFalse = (Action)((null)))
{
    var isOnlyOne = lst.Count == 1;
    if (isOnlyOne && callbackOnTrue != null) callbackOnTrue();
    if (!isOnlyOne && callbackOnFalse != null) callbackOnFalse();
    return isOnlyOne;
}
Комментарии (0)

необязательные параметры не параметры по умолчанию! я предлагаю вам оба параметров по умолчанию. GetFooBar(тип int а=0, инт б=0), если вы Don'Т есть какие-либо перегруженный метод, приведет в=0, б=0, если вы Don'т пройти любые значения,если вы передаете значение 1, в результате, сдал значения, 0 и если бы вы пройти 2 значения 1-го назначается и второй B.

надеюсь, что ответил на ваш вопрос.

Комментарии (0)

В случае, если значения по умолчанию не't доступный способ, чтобы добавить дополнительный параметр, чтобы использовать .Чистый класс OptionalAttribute - https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.optionalattribute?view=netframework-4.8

Пример кода ниже:

namespace OptionalParameterWithOptionalAttribute
{
    class Program
    {
        static void Main(string[] args)
        {
            //Calling the helper method Hello only with required parameters
            Hello("Vardenis", "Pavardenis");
            //Calling the helper method Hello with required and optional parameters
            Hello("Vardenis", "Pavardenis", "Palanga");
        }
        public static void Hello(string firstName, string secondName, 
            [System.Runtime.InteropServices.OptionalAttribute] string  fromCity)
        {
            string result = firstName + " " + secondName;
            if (fromCity != null)
            {
                result += " from " + fromCity;
            }
            Console.WriteLine("Hello " + result);
        }

    }
}
Комментарии (0)

У меня есть веб-сервис написать, который принимает 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 также ясно, как использовать его из интерфейса.

Это'ы хак, но он будет работать.

Комментарии (1)

Я должен был сделать это в VB.Net сервисы Web 2.0. Я в конечном итоге с указанием параметров в виде строк, а затем преобразовывать их, что мне нужно. Необязательный параметр задан пустой строкой. Не самое чистое решение, но это сработало. Только будьте осторожны, что вы поймать все исключения, которые могут произойти.

Комментарии (0)