2010-08-02 6 views
4

Извините, если дублировать.Использование названных параметров

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

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

ответ

7

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

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

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

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

3

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

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

5

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

Например:

DrawLine (10, 10, 25, 16);

Если вы не знакомы с этим (вымышленным) методом DrawLine, но знаете, что коробка должна быть немного выше, вам нужно будет найти метод, чтобы определить, какой параметр изменить. (Является ли это "Left, Top, Right, Bottom" или "Top, Left, Bottom, Right" или "Top, Height, Left, Width" и т.д.)

Но:

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

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

2

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

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

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

Смежные вопросы