抱歉,如果重复。
我正在通过C#阅读CLR。 “参数”一章从可选参数和命名参数的说明开始。
那么,你能举出一些例子,说明使用命名参数有什么好处,还是风格或习惯问题?你个人使用命名参数吗?
答案 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个参数,所以我使用命名参数来更好地理解。