[VS2010] C# 4.0 語言新功能:Named Argument and Optional Parameters

[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 雖然好用,但絕對不要濫用,否則會對程式可讀性有相當大的傷害。