如何使用C# 4.0的具名和選擇性參數

如何使用C# 4.0的具名和選擇性參數

C#的語法一向以嚴謹著稱,過去在VB.NET提供的選擇性參數,在使用C#開發時無法使用這個便利的功能,到了C# 4.0開始支援具名與選擇性參數,請見下列說明:

【Before】

以下程式碼範例為一個顯示該位址的機器名稱的函式,在C# 4.0以前的版本,要呼叫ShowHostName函式必須同時傳入ip、includeIPCount及showAnyAlias參數才行,若其中有些參數不需要強制傳入,對於參數多的函式而言,使用上較不方便,因為每個參數都必須給值才行,對此,很多人會使用物件導向中的多載,將不同參數數量的函式獨立出來,但這又會造成維護上的負擔。

   1:  static void Main(string[] args)
   2:  {
   3:      ShowHostName("127.0.0.1", true, true);
   4:      Console.Read();
   5:  }
   6:  
   7:  /// <summary>
   8:  /// 依據IP位址顯示機器名稱
   9:  /// </summary>
  10:  /// <param name="ip">IP位址</param>
  11:  /// <param name="includeIPCount">顯示該機器上的IP數量</param>
  12:  /// <param name="showAnyAlias">是否顯示主機別名</param>
  13:  static void ShowHostName(string ip,bool includeIPCount ,bool showAnyAlias)
  14:  {
  15:      System.Net.IPHostEntry iphs = System.Net.Dns.GetHostEntry(ip);            
  16:      string count = iphs.AddressList.Count().ToString();
  17:      Console.WriteLine("機器名稱={0},IP數量={1},別名={2}"
  18:                                  , iphs.HostName, includeIPCount == true ? count : "n/a"
  19:                                  , showAnyAlias == true ? iphs.Aliases.Any().ToString() : "n/a");
  20:  }

 

【After】

以下程式碼範例,筆者將上述的ShowHostName函式中includeIPCount及showAnyAlias參數加入預設值(true),以將之設定為選擇性參數(如第7列的程式碼):

   1:  /// <summary>
   2:  /// 依據IP位址顯示機器名稱
   3:  /// </summary>
   4:  /// <param name="ip">IP位址</param>
   5:  /// <param name="includeIPCount">顯示該機器上的IP數量</param>
   6:  /// <param name="showAnyAlias">是否顯示主機別名</param>
   7:  static void ShowHostName(string ip,bool includeIPCount = true,bool showAnyAlias = true)
   8:  {
   9:      System.Net.IPHostEntry iphs = System.Net.Dns.GetHostEntry(ip);            
  10:      string count = iphs.AddressList.Count().ToString();
  11:      Console.WriteLine("機器名稱={0},IP數量={1},別名={2}"
  12:                                  , iphs.HostName, includeIPCount == true ? count : "n/a"
  13:                                  , showAnyAlias == true ? iphs.Aliases.Any().ToString() : "n/a");
  14:  }

 

接著我們就可以以下列幾種方式來呼叫包含選擇性參數的函式,說明如下:

   1:  //方法1:只傳入具名參數
   2:  ShowHostName("127.0.0.1");
   3:  //方法2:依照順序傳入參數的值
   4:  ShowHostName("127.0.0.1", false,false);
   5:  //方法3-1:使用具名參數來指定選擇性參數的值
   6:  ShowHostName("127.0.0.1", includeIPCount: false);
   7:  //方法3-2:使用具名參數來指定選擇性參數的值
   8:  ShowHostName("127.0.0.1",showAnyAlias: false);

需特別注意的是選擇性參數不能放在具名參數之前,下列程式碼範例為C# 4.0所不允許的使用方式:


ShowHostName("127.0.0.1", includeIPCount: false, true);

錯誤    1    具名引數規格必須出現在所有已指定的固定引數之後    D:\Visual Studio 2010\Projects\ConsoleApplication1\ConsoleApplication1\Program.cs    21    62    ConsoleApplication1

 

【參考資料】