Использование именованных параметров - PullRequest
4 голосов
/ 02 августа 2010

Извините, если дубликат.

Я читаю CLR через C #.Глава «Параметры» начинается с объяснения необязательных и именованных параметров.

Итак, можете ли вы привести пример, когда использование именованных параметров имеет некоторые преимущества, или это просто вопрос стиля или привычки?Вы лично используете именованные параметры?

Ответы [ 5 ]

7 голосов
/ 02 августа 2010

Именованные параметры очень полезны в сочетании с необязательными параметрами в C # 4. Это позволяет избежать многих перегрузок метода, а вместо этого иметь только один.

Например, вместо 5 версий метода вы можете предоставить один метод с несколькими необязательными параметрами, а затем вызвать его как:

this.Foo("required argument", bar: 42);

Это может упростить API (один метод вместо многих) и при этом обеспечить такую ​​же гибкость, не требуя от пользователя ввода каждого аргумента. Без этого вам понадобится либо много перегрузок, либо вам придется предоставить все значения по умолчанию.

5 голосов
/ 03 августа 2010

Помимо использования с необязательными параметрами, именованные параметры иногда полезны, чтобы сделать код более читабельным.

Например:

DrawLine (10, 10, 25, 16);

Если вы не знакомы с этим (вымышленным) методом DrawLine, но знаете, что поле должно быть немного выше, вам придется поискать метод, чтобы определить, какой параметр нужно изменить.(Это «Левый, Верхний, Правый, Нижний» или «Верхний, Левый, Нижний, Правый» или «Верхний, Высокий, Левый, Ширина» и т.д.)

Но:

DrawLine(left: 10, top: 10, width: 25, height: 16); 

Это ясно дает понять, что именно предназначено и какой параметр настраивается.

3 голосов
/ 02 августа 2010

Предположим, у вас есть 5 необязательных логических параметров, и вы хотите передать только один из них.

Использование именованных параметров позволяет сделать это без каких-либо двусмысленностей.

2 голосов
/ 03 августа 2010

Именованные параметры очень тесно связаны со значениями по умолчанию для параметров (необязательно), таких как:

void Foo(int i = 10)

И это очень хорошо для нескольких целей, как уже описаны другие ответы.

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

//Without optional parameters
public MyObj()
{
    this.result = 3628800; //Factorial 10 - pretty fast
}

public MyObj(int n)
{
    this.result = factorial(n);
}

//With optional parameters but same results for any number of n
public MyObj(int n = 10)
{
    this.result = factorial(n); //A lot slower when we just need the result for 10
}

//Usage
new MyObj(); //Fast with constructor overloading - slower with optional parameters

Это глупый пример, но идея очень важна. Я знаю, что Андерс Х. (соавтор C #) использовал это в качестве аргумента, чтобы не вводить необязательные параметры. Но я думаю, что большинство программистов будут использовать соответствующий метод, когда в проекте подчеркивается производительность, удобочитаемость и т. Д.)

Следует также отметить, что более новый инициализатор ...

var foo = new Foo(...)
{
    SomeProperty1 = something,
    SomeProperty2 = something
}

... во многих случаях может быть хорошей альтернативой именованному стилю параметра.

0 голосов
/ 03 августа 2010

Я нуждался в них несколько дней назад ... Мне нужно было передать функции полный параметр объекта по параметру, и это были примерно 20 параметров, поэтому я использовал именованные параметры для лучшего понимания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...