Значение по умолчанию в функции С#
можно ли это сделать в С#? (в С++ его нет)
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)