使用命名参数

时间:2010-08-02 16:21:12

标签: c#-4.0

抱歉,如果重复。

我正在通过C#阅读CLR。 “参数”一章从可选参数和命名参数的说明开始。

那么,你能举出一些例子,说明使用命名参数有什么好处,还是风格或习惯问题?你个人使用命名参数吗?

5 个答案:

答案 0 :(得分:7)

当与C#4中的可选参数结合使用时,命名参数非常有用。这使您可以避免提供大量方法重载,而只需要一个方法重载。

例如,您可以提供一个带有多个可选参数的方法,而不是拥有5个版本的方法,然后将其命名为:

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

这可以简化API(一种方法而不是多种方法),并且仍然提供相同的灵活性,而无需用户键入每个参数。如果没有这个,你需要多次重载,或者必须提供所有默认值。

答案 1 :(得分:5)

除了与可选参数一起使用之外,命名参数有时可以使代码更具可读性。

例如:

DrawLine(10,10,25,16);

如果你不熟悉这个(虚构的)DrawLine方法,但是你知道盒子需要更高一些,你必须查找方法来确定要更改的参数。 (它是“左,上,右,下”还是“上,左,下,右”或“顶部,高度,左,宽”等。)

可是:

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

这清楚地表明了预期的内容和要调整的参数。

答案 2 :(得分:3)

假设您有5个可选的布尔参数,并且您只想传入其中一个。

使用命名参数可以毫不含糊地执行此操作。

答案 3 :(得分: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
}
在许多情况下,

...可以替代命名参数样式。

答案 4 :(得分:0)

几天前我需要它们...... 我不得不通过参数给一个函数提供一个完整的对象参数,这些参数就像20个参数,所以我使用命名参数来更好地理解。