对不起,如果重复。命名参数的使用
我正在通过C#阅读CLR。章节“参数”从可选参数和命名参数的解释开始。
那么,你可以举一些例子,说明使用命名参数有什么好处,还是只是风格或习惯的问题?你个人使用命名参数吗?
对不起,如果重复。命名参数的使用
我正在通过C#阅读CLR。章节“参数”从可选参数和命名参数的解释开始。
那么,你可以举一些例子,说明使用命名参数有什么好处,还是只是风格或习惯的问题?你个人使用命名参数吗?
与C#4中的可选参数结合使用时,命名参数非常有用。这样可以避免提供大量的方法重载,而只需要一个参数。
例如,代替具有5个版本的方法,可以提供一种方法与多个可选参数,然后调用它为:
this.Foo("required argument", bar: 42);
这可以简化的API(一个方法,而不是许多) ,并且仍然提供相同的灵活性,而不需要用户输入每个参数。没有这个,你需要很多重载,或者必须提供所有的默认值。
假设您有5个可选的布尔参数,并且您只想传入其中一个参数。
使用命名参数可以让您做到这一点,不会有任何歧义。
除了与可选参数一起使用外,命名参数有时可用于使代码更具可读性。
例如:
的DrawLine(10,10,25,16);
如果您不熟悉这个(虚构的)DrawLine方法,但您知道该方框需要更高一些,那么您必须查找该方法以确定要更改哪个参数。 (它是 “左,上,右,下” 或 “上,左,下,右” 或 “顶部,高度,左,宽度” 等)
但是:
DrawLine(left: 10, top: 10, width: 25, height: 16);
这使得明确准确定义和调整哪个参数。
命名参数是非常有默认值相关的参数(可选),如:
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
}
...在很多情况下,它可以是指定参数样式的一个很好的替代方案。
我前几天需要他们...... 我不得不通过参数给一个完整的对象参数给一个函数,而那些参数就像20个参数,所以我使用了命名参数以便更好地理解。