C#方法调用使用参数名和冒号

53

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

MethodCall(parameter1:value1, parameter2:value2);

这是一种新的语言特性吗?它让我想起了在SQL中调用存储过程并指定参数名称的方式:

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

这是一个类似的功能吗?如果是,那么它有什么作用?如果不是,那么它是什么以及它应该用于什么目的。


这似乎与Python中的实现方式很类似,您可以使用 method(param="value") 语法明确指定要调用的参数。 - Lou
5个回答

49

10
在不必导航到方法定义或让Intellisense告诉你所有参数名称的情况下,直接看到参数名称会带来很多价值。 - Zann Anderson

27
值得一提的是,与可选参数不同,你可以跳过某些参数,并仅传递你感兴趣的参数。
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);
}

24

命名参数允许您独立于签名以自定义顺序显式设置参数的值。方法签名由参数类型定义,例如Foo(int i,bool b),只会按该顺序接受类型为int和bool的参数。命名参数允许您先传递b,再传递i。


2
我熟悉方法签名的概念,我想知道这是否允许您更改调用中参数的顺序。但我很好奇 - 能够更改顺序的意义是什么? - Zann Anderson
1
这只是一种代码“可读性”的偏好。方法签名是静态的,因为当它被调用时,参数将按照方法签名中定义的顺序放置在堆栈上。 “命名参数”功能只允许您按照自己的喜好重新排列参数。 - Brandon Moretz
3
对我而言,真正的价值在于拥有具有许多默认值的方法。如果你只需要更改其中一些值,你可以使用命名参数来挑选它们。这样,你就不必重复声明在你想要更改的值之前的所有默认值。 - André C. Andersen
@Zannjaminderson,我几周前向一些同事解释这个概念时,实际上正讨论这一点作为一个优点。不知道为什么我没有在答案中包含它,因为它绝对是一个巨大的优势。+1 - Brandon Moretz

6

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接