C#参数后的冒号:命名实参和可选实参

c# 4.0 attributes在C# 4.0中,为了简化在COM调用中Type.Missing的调用,引进了命名实参和可选实参,这个是个好东西,当然,也带来了副作用。 

MSDN上是这么描述的:

 Visual C# 2010 引入了命名实参和可选实参。
利用“命名实参”,您将能够为特定形参指定实参,方法是将实参与该形参的名称关联,而不是与形参在形参列表中的位置关联。
利用“可选实参”,您将能够为某些形参省略实参。
这两种技术都可与方法、索引器、构造函数和委托一起使用。

在使用命名实参和可选实参时,将按实参出现在实参列表(而不是形参列表)中的顺序计算这些实参。
命名形参和可选形参一起使用时,您将能够只为可选形参列表中的少数形参提供实参。
此功能大大方便了对 COM 接口(例如 Microsoft Office 自动化 API)的调用。

这也就意味着,像原来的函数重载在这里可以得到更有效的方法编写:

如原来的重载:

public void Method(string p1, string p2, string p3) {...}

public void Method(string p1, string p2) {...}

public void Method(string p1, string p3) {...}

public void Method(string p1) {...}

在2010上,将可以直接变成public void Method(string p1, string p2=default_value, string p3=default_value)即可。

调用的时候,直接指定参数,如要掉用上面第三个方法,则只需要:Method(p1, p3:p3_value)即可,相当方便。

当然,在调用COM的API时,使用可选的形参就不用在使用Type.Missing这样的类型来折腾了,可以变得非常的简介,并能有效增加阅读性。

如调用MS Excel Range中AutoFormat,光形参就达七个之多,在C#3.0及之前版本,我们必须使用全参数传递形式来处理,结果就变成如下模样:

excelApp.get_Range("A1", "B4").AutoFormat(myFormat, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);

好吧,别说你不爽,我当年每每写这段代码的时候,就在不断的纠结中.但在C# 4.0里面,我们有了命名参数和可选实参,将大大简化书写,上面的这么长一串,可以这样写:

 excelApp.Range["A1", "B4"].AutoFormat( Format: myFormat );

看,大大简化了参数的个数,格式清晰明了,参数干净简洁。

上面说了这么多,当然都是好处,但相比到这里,你也会有同样的疑问,现在出了这么个东西,那重载怎么办?万一重载了,而又使用了可选参数,怎么办? 显然,重载还存在,使用可选参数,必然会对重载产生影响,这个就是它的副作用了,在MSDN中,也明确给出了可能会对重载产生的影响,原文如下:

重载决策
--------------------------------------------------------------------------------

使用命名实参和可选实参将在以下方面对重载决策产生影响


1. 如果方法、索引器或构造函数的各个形参均为可选,或者按名称或位置与调用语句中的单个实参对应,并且该实参可转换为形参的类型,则该方法、索引器或构造函数是执行的候选项。

2. 如果找到多个候选项,则会将首选转换的重载决策规则应用于显式指定的实参。
将忽略可选形参已省略的实参。

3. 如果两个候选项不相上下,则会将没有可选形参的候选项作为首选项,对于这些可选形参,已在调用中为其省略了实参。
这是具有较少形参的候选项的重载决策中一般首选项的结果。

在实际使用的时候,需要注意使用。

如果有任何问题欢迎讨论。

转载注明出处:MitchellChu


Tuesday, April 03, 2012 | .NET技术 其他技术

关于博主

  一枚成分复杂的网络IT分子,属于互联网行业分类中的杂牌军。