关于C#4.0,这两个中哪一个是正确的术语:命名参数或命名参数?我发现这两个术语很多都出现了,所以如何提及它们(比如正式文档中)很困惑?
答案 0 :(得分:4)
参数始终已命名;在为方法提供值的上下文中,它们是 arguments - 但是,您指定的名称是参数名称。所以我可以看到它会如何混淆; p但在上下文中,我们提供了编译器的名称来用来解析参数,所以“命名参数”ftw。
更具体地说:
7.5.1参数列表
带有参数名称的参数被称为 命名参数 ,而没有参数名称的参数是 位置参数 。位置参数出现在参数列表中的命名参数之后是错误的。
答案 1 :(得分:1)
MS本身refers to them as "named arguments"。他们创造了这种语言;我会坚持使用它们。
(除非有人在MSDN上找到引用C#上下文中“命名参数”的内容。
编辑:有人做了。使用你想要的任何地狱术语。 :)
答案 2 :(得分:1)
我看过它们可以互换使用,但我喜欢在定义方面使用参数,并且在传递的值方面使用参数。例如,以下类具有“类型参数”:
class A<T> { }
但是以下声明有一个“类型参数”:
var a = new A<string>();
引用C#4规范:
由于类型参数可以使用许多不同的实际类型参数进行实例化,因此类型参数的操作和限制与其他类型略有不同。
另一句话:
带有default-argument的fixed-parameter被称为可选参数,而没有default-argument的fixed-parameter是必需参数。
C#规范引用“命名参数”的唯一时间(AFAIKnew)与Attributes
有关。但是,当提到新功能时,他们会使用“命名参数”。所以,我会遵循这种模式。
<强>更新强>
Marc有一个很好的观点,即参数总是被命名,但这并不意味着现在也可以命名参数。该名称仍属于参数,并且参数提供给它。使用新的“命名参数”功能,提供参数可能有两个部分:参数本身,以及提供它的参数的名称。
// The part before the : is the named parameter,
// and the part after the : is the argument
SomeMethod(someParam: someArg);
我知道这是分裂的头发,但我仍然认为这是一个有效的观点。就我而言,您将被理解为使用“命名参数”还是“命名参数”。 (另外,第7.5.1节仍然瞪着我。)
答案 3 :(得分:0)
在我个人看来,我认为7.5.1有倒退,7.5.1.1也证实了这一点:
如果未找到唯一参数列表,则构造具有不可访问名称且没有可选参数的参数列表,以便调用不能使用命名参数或省略可选参数。
在调用中,您可以为应该接受传递给它的参数的参数命名。
public static void SayHello(string name = "John Doe", int age = 30)
{
Console.WriteLine("Hello {0}, I see you're {1} years old.", name, age);
}
static void Main(string[] args)
{
SayHello(age:42);
}
Inside Main我没有传递任何参数到“name”参数,我不需要因为它有一个默认值使参数可选(参数不是可选的,因为它显然存在于SayHello函数中)。然而,我已经指定参数42应该传递给“age”参数(换句话说,我已经在调用中命名了参数)。如果我可以为参数命名,我应该能够给它们任意名称:
SayHello(语言:“vFred”,版本:7);
我认为允许“命名参数”的唯一原因是,如果我使用的API不对方法的参数使用描述性名称。然后至少我可以在调用者站点命名参数,这样才有意义。但是唉,C#不允许你给你的参数赋予任何名称,但是它允许你指定应该接受参数的参数的名称。
这种推理当然只有在您认为参数和参数不可互换时才有效,而且参数是被调用站点上的列表,而参数位于调用者站点上,这至少是C ++定义它们的方式。