[VS2010] C# 4.0 语言新功能:Named Argument and Optional Parameters
如果你是曾经用过 C# 来开发 Office 应用程序的开发人员,想必对这种程序一定很熟悉:
this.SaveAs(@"C:Book1.xml", Excel.XlFileFormat.xlXMLSpreadsheet,
??? Type.Missing, Type.Missing, Type.Missing, Type.Missing, Excel.XlSaveAsAccessMode.xlNoChange,
??? Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
这是因为到了 C# 3.0 为止,它都不支持选择性参数 (Optional Parameters) 的功能,因此在 Office 应用程序开发时,所有的选择性参数都一定要使用 Type.Missing 作为参数代表不设定,而 Office 对象模型中到处都是这种有一大堆选择性参数的函数与方法,最根本的原因是对象模型本身是为了 VBA (Visual Basic for Applications) 语言来设计的,VB/VBA 都支持选择性参数,所以相同的程序在 VB 中只要这样:
Me.SaveAs(FileName:="C:Book1.xml", FileFormat:=Excel.XlFileFormat.xlXMLSpreadsheet, AccessMode:=Excel.XlSaveAsAccessMode.xlNoChange)
在上面的程序中我们也看到了另一个只有 VB/VBA 才有的功能:具名参数 (Named Argument),它可以在不按照参数顺序的情况下,直接以参数名称来设定参数的值,所以用 VB/VBA 开发 Office 应用程序比 C# 要简单非常非常多,对 C# 的开发人员其实也不太公平。
不过,这样不公平的情况,到了 C# 4.0 (VS 2010) 时,将会有很大的变化,因为 C# 4.0 开始支持了 Named Argument 以及 Optional Parameters 两种功能,以上面的那行程序来看,用 C# 4.0 可以写成这样:
this.SaveAs(FileName: @"C:Book1.xml", FileFormat: Excel.XlFileFormat.xlXMLSpreadsheet, AccessMode: Excel.XlSaveAsAccessMode.xlNoChange);
如何?是不是和 VB 一样简单了呢?
具名参数(Named Argument)
具名参数顾名思义,就是直接使用参数的名称来设定参数值,这个功能在 VB/VBA 中已经是司空见惯,并且被 C# 开发人员视为相当称羡的功能之一,C# 4.0 编译器以及 Visual Studio 2010 编辑界面开始支持具名参数,例如下列的函数:
public int MyFunction(int ArgA, int ArgB, int ArgC)
{
??? return ArgA * ArgB * ArgC;
}
开发人员可以用下列三种方式调用:
MyFunction(ArgA: 5, ArgB: 12, ArgC: 24); // return 5 * 12 * 24
MyFunction(ArgC: 5, ArgA: 12, ArgB: 24); // return 12 * 24 * 5
MyFunction(ArgB: 5, ArgC: 12, ArgA: 24); // return 24 * 5 * 12
选择性参数(Optional Parameters)
选择性参数也是 VB/VBA,以及 C/C++ 有的功能,只是 C# 一直都没有加进来,新的 C# 4.0 开始加入了选择性参数的功能,例如下列的函数:
public int MyFunction(int ArgA, int ArgB = 12, int ArgC = 5)
{
??? return ArgA * ArgB * ArgC;
}
下列调用方式会有不同的值:
MyFunction(14, 22, 43); // return 14 * 22 * 43
MyFunction(16); // return 16 * 12 * 5
MyFunction(ArgB: 25); // 错误,因为 ArgA 没有指定参数。
MyFunction(16, ArgC: 100); // return 16 * 12 * 100
选择性参数最直接的好处,就是不用再写一大堆的 Type.Missing,就可以轻松的调用 COM 的对象方法了。例如下列的函数:
var excelApp = new Microsoft.Office.Interop.Excel.Application();
var myFormat = Microsoft.Office.Interop.Excel.XlRangeAutoFormat.xlRangeAutoFormatAccounting1;
excelApp.get_Range("A1", "B4").AutoFormat(myFormat, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
到了 C# 4.0,只要这样写就好了:
var excelApp = new Microsoft.Office.Interop.Excel.Application();
var myFormat = Microsoft.Office.Interop.Excel.XlRangeAutoFormat.xlRangeAutoFormatAccounting1;
excelApp.get_Range("A1", "B4").AutoFormat( Format: myFormat );
不过请务必记住一件事,Named Argument 和 Optional Parameters 虽然好用,但绝对不要滥用,否则会对程序可读性有相当大的伤害。
原文:大专栏 [VS2010] C# 4.0 语言新功能:Named Argument and Optional Parameters