2010-08-02 137 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个参数,所以我使用了命名参数以便更好地理解。