2010-08-02 134 views
4

對不起,如果重複。命名參數的使用

我正在通過C#閱讀CLR。章節「參數」從可選參數和命名參數的解釋開始。

那麼,你可以舉一些例子,說明使用命名參數有什麼好處,還是隻是風格或習慣的問題?你個人使用命名參數嗎?

回答

7

與C#4中的可選參數結合使用時,命名參數非常有用。這樣可以避免提供大量的方法重載,而只需要一個參數。

例如,代替具有5個版本的方法,可以提供一種方法與多個可選參數,然後調用它爲:

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

這可以簡化的API(一個方法,而不是許多) ,並且仍然提供相同的靈活性,而不需要用戶輸入每個參數。沒有這個,你需要很多重載,或者必須提供所有的默認值。

3

假設您有5個可選的布爾參數,並且您只想傳入其中一個參數。

使用命名參數可以讓您做到這一點,不會有任何歧義。

5

除了與可選參數一起使用外,命名參數有時可用於使代碼更具可讀性。

例如:

的DrawLine(10,10,25,16);

如果您不熟悉這個(虛構的)DrawLine方法,但您知道該方框需要更高一些,那麼您必須查找該方法以確定要更改哪個參數。 (它是 「左,上,右,下」 或 「上,左,下,右」 或 「頂部,高度,左,寬度」 等)

但是:

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 

這是一個愚蠢的例子,但這個想法是非常重要的。我知道Anders H.(C#的合着者)將此作爲不引入可選參數的參數。但我想大多數程序員會在性能,可讀性等被強調在一個項目中時使用適當的方法:)

還應該指出,新的初始化程序...

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

...在很多情況下,它可以是指定參數樣式的一個很好的替代方案。

0

我前幾天需要他們...... 我不得不通過參數給一個完整的對象參數給一個函數,而那些參數就像20個參數,所以我使用了命名參數以便更好地理解。