程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> C#4.0初探:Optional and named parameters

C#4.0初探:Optional and named parameters

編輯:關於C#

Optional and named parameters特性在有些場合提供很大的方便,特別是Office開發中可以告別一坨System.Reflection.Missing了。這裡簡單了解一下C#4.0中的Optional and named parameters。

在VS2010 CTP中的C#4.0編譯器調試通過,正式版可能會有些變化。

1.使用示例

class Program
{
    static void Main(string[] args)
    {
        Test t = new Test();
        t.OptionalAndNamedParams(1);
        t.OptionalAndNamedParams(2, "a");
        t.OptionalAndNamedParams(3, c: "b", b: "a");
        t.OptionalAndNamedParams(4, c: "http://g.cn");
    }
}

class Test
{
    // a為必選參數;b,c為可選參數
    public void OptionalAndNamedParams(int a, string b = "", object c = "http://xianfen.net")
    {
        Console.WriteLine("a:{0}, b:{1}, c:{2}", a, b, c);
    }
}

運行結果為:

使用中的注意事項:

當必選參數與可選參數在同一個方法中混合使用時,必選參數的聲明應該放在可選參數的前面。

可選參數的初始值必須是一個在編譯期可確定的常量。

可選參數不可用ref,out等修飾符。

如果全部顯式指定參數名(paraName:value),參數的順序可以任意調整。

2.內部實現

ILDASM反編譯一下Test.OptionalAndNamedParams,代碼段為:

.method public hidebysig instance void  OptionalAndNamedParams(int32 a,
[opt] string b,
[opt] object c) cil managed
{
  .param [2] = ""
  .param [3] = "http://www.xianfen.net"
  // ...

可選參數前聲明為OptionalAttribute特性。這是C#4.0的語法糖。

Test.OptionalAndNamedParams方法等價的代碼為:

public void OptionalAndNamedParams(int a,
    [Optional, DefaultParameterValue("")] string b,
    [Optional, DefaultParameterValue("http://www.xianfen.net")] object c)
{
    Console.WriteLine("a:{0}, b:{1}, c:{2}", a, b, c);
}

如果不用DefaultParameterValueAttribute特性設置默認值,則輸出為:

現在知道了Office開發中Missing的原因了。

OptionalAttribute和DefaultParameterValueAttribute不是FCL的新類,他們把方法的參數聲明為可選方法和指定默認值,以便被支持可選參數和默認參數的語言調用(如VB、VC++等)。

3.調用過程

Main方法中,調用t.OptionalAndNamedParams(1)的IL代碼為(Release模式編譯):

  IL_0006:  ldloc.0
  IL_0007:  ldc.i4.1
  IL_0008:  ldstr      ""
  IL_000d:  ldstr      "http://www.xianfen.net"
  IL_0012:  callvirt   instance void Test::OptionalAndNamedParams(int32,string,object)

可以看到,編譯器先取得可選參數的默認值,然後像常規方法一樣調用,並不是後期邦定,這在程序集版本控制時應加以注意,更新了應用程序中含有可選參數方法的程序集後,可能由於默認值的改變導致程序行為異常。

4.方法重載

可選參數與方法重載時,方法的調用方式一模一樣,到底調用的哪個可以舉個例子:

在上面的Test類添加一個方法,定義為:

public void OptionalAndNamedParams(int a, string b)
{
    Console.WriteLine("overload, a:{0}, b:{1}", a, b);
}

輸出結果變成:

可以看出,首先調用參數完全匹配的方法。

參考資料:

MSDN

Named arguments, optional arguments, and default values(http://blogs.msdn.com/samng/archive/2009/02/03/named-arguments-optional-arguments-and-default-values.aspx)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved