带有参数名和冒号的C#方法调用

带有参数名和冒号的C#方法调用,c#,language-features,method-call,C#,Language Features,Method Call,我开始注意到,当我在C#中进行方法调用时,我正在调用的方法的参数名称将显示在intellisense列表中,并附加一个冒号,然后我可以格式化方法调用: MethodCall(parameter1:value1, parameter2:value2); 这是一种新的语言功能吗?它让我想起了在SQL中调用存储过程并指定参数名称的方法,如下所示: spDoSomeStuff @param1 = 1, @param2 = 'other param' 这是类似的特征吗?如果是,目的是什么?如果没有,它

我开始注意到,当我在C#中进行方法调用时,我正在调用的方法的参数名称将显示在intellisense列表中,并附加一个冒号,然后我可以格式化方法调用:

MethodCall(parameter1:value1, parameter2:value2);
这是一种新的语言功能吗?它让我想起了在SQL中调用存储过程并指定参数名称的方法,如下所示:

spDoSomeStuff @param1 = 1, @param2 = 'other param'

这是类似的特征吗?如果是,目的是什么?如果没有,它是什么,它的用途是什么。

这是一项新功能。请看这里:
例如,命名参数在Objective中是标准的。习惯它们需要一些时间,但它们是一件好事。只有通过观察,你才能知道参数的用途。

Scott Gu在他的博客中介绍了这一新功能:


这是C#4附带的参数。

命名参数允许您以独立于签名的自定义顺序显式设置参数值。方法签名由参数类型定义,即Foo(inti,bool b),它只接受按该顺序排列的int和bool类型的参数。命名参数允许您首先传递b,然后传递i。

值得一提的是,与可选参数不同,您可以跳过某些参数,只传递您感兴趣的参数

public void Example(int required, string StrVal = "default", int IntVal = 0)
{
    // ...
}

public void Test()
{
    // This gives compiler error
    // Example(1, 10);

    // This works
    Example(1, IntVal:10);
}

我熟悉方法签名的概念,我想知道这是否允许您更改调用中参数的顺序。不过我很好奇——能够改变顺序有什么意义呢?它实际上只是一种代码“可读性”偏好。方法签名是静态的,因为调用它时,参数将按照在方法签名中定义的顺序放置在堆栈上。“命名参数”功能只允许您根据自己的喜好重新排列参数。@Zannjaminderson对我来说,当您有许多默认值的方法时,真正的值就会出现。如果您只需要更改其中的一些,可以使用命名参数将其挑选出来。这样,您就不必重述要更改的默认值之前的所有默认值。@Zannjaminderson几周前,我向一些同事解释这个概念时,实际上只是在讨论这一点作为一种好处。不知道为什么我没有把它包括在答案中,因为它肯定是一个巨大的好处+1I无需导航到方法的定义或让intellisense告诉您它们都是什么,就可以让参数名立即可见,这对我来说很有价值。