Значение по умолчанию в функции С#

можно ли это сделать в С#? (в С++ его нет)

function sum ( int a = 9, int b = 4){

}

а затем вызовите функцию:

int someValue = sum(, 14) // so 14 is for the second value

Ответы

Ответ 1

С# 4 позволяет именованные аргументы и необязательные параметры 1:

int Sum (int a = 9, int b = 4)
{
    return a + b;
}

Тогда:

Sum(10, 5);       // Positional arguments as "normal"
Sum(b: 5);        // Use the default value for a
Sum(a: 5);        // Use the default value for b
Sum();            // Default both parameters
Sum(b: 1, a: 10); // Arguments can be reordered

EDIT: для перегруженных методов, если есть несколько совпадений, компилятор проверяет, действителен ли только один из этих кандидатов из-за предоставления значений по умолчанию. В этом случае эти кандидаты получают приоритет. Это одно из правил нарушения правил, перечисленных в разделе 7.5.3.2. Нет предпочтения просто использовать "меньше" значений по умолчанию; это все или ничего не подходит. Я приведу пример этого в статье о перегрузке.


1 Это печально, что терминологию часто путают даже Microsoft. Параметры всегда имеют имена - что нового в том, что вы можете указать имя в вызывающем коде для аргумента. С другой стороны, вы делаете параметр необязательным, указав по умолчанию.

Ответ 2

С С# 4 вы можете сделать int someValue = sum (b: 14);

EDIT - согласно комментариям:

С++ может иметь значения по умолчанию для параметров... эти параметры могут быть "пропущены" при вызове метода/функции. НО правило в С++ заключается в том, что можно пропустить только самые правые параметры... что позволяет С++, чтобы вызвать sum() и sum (7), ссылаясь на a, но не на вызов, который вы даете в качестве примера...

Ответ 3

Да, поскольку .NET 4 Framework это возможно, используя Дополнительные аргументы

public int sum(int x = 0, int y = 0)
{
     return x + y;
}

Затем назовите его:

int sumvalue = sum(y: 15);

Важно:

Дополнительные параметры определяются в конце списка параметров, после любых требуемых параметров. Если вызывающий объект предоставляет аргумент для любой из последовательных необязательных параметров, он должен обеспечивать аргументы для всех предыдущих необязательных параметров. Разделенные запятыми пробелы в списке аргументов не поддерживаются. Например, в следующем код, метод экземпляра ExampleMethod определяется одним обязательным и два необязательных параметра

Ответ 4

Да, это возможно в С#, используя именованные и необязательные аргументы.

public int Sum(int a = 1, int b = 2)
{
    return a + b;
}

Console.WriteLine(Sum(2));    // Writes 4.
Console.WriteLine(Sum());     // Writes 3.
Console.WriteLine(Sum(b: 4)); // Writes 5.

Это приведет к тому, что значение будет установлено равным 2 и b будет иметь значение по умолчанию, 2. Оно всегда будет заполнять аргументы в порядке, поэтому, если вы передаете только один аргумент, тогда только a получает набор, а остальные будут использовать значения по умолчанию.

Sum(2)

Это приведет к тому, что в нем будет установлено значение по умолчанию 1 и b будет установлено по умолчанию. 2. Поскольку аргументы не были предоставлены.

Sum()

Это приведет к тому, что оно будет иметь значение по умолчанию 1, а b будет установлено в 4. Порядок аргументов причины игнорируется в этом случае, потому что мы указываем, что b должно быть установлено в 4 с использованием именованного аргумента.

Sum(b: 4)