我們來自五湖四海,不為別的,只因有共同的愛好,為中國互聯網發展出一分力!

C# 4.0 中的默認參數

2012年01月18日09:22 閱讀: 22944 次

標簽: C#, VS2010, 默認參數, 技巧介紹

在C#4.0中,對于我來說,首先吸引我的就是默認參數這個特性。當我在Python中非常流暢的使用這個特性時,C#卻只能寫大量的重載函數,然 后一個調一個,最終調用的是參數最多的那一個。

Before c# 4.0

在4.0之前,我要一個函數的參數有 默認值時,就必須要這樣寫:


static void OldFun(string param1)
{
    OldFun(param1, "default param2");
}

static void OldFun(string param1, string param2)
{
    OldFun(param1, param2, "default param3");
}

static void OldFun(string param1, string param2, string param3)
{
    var content = string.Format("{0},{1},{2}",param1,param2,param3);
    Console.WriteLine(content);
}
真折磨人,想不明白為啥微軟就不提供一個默認參數呢,這點上我都羨慕C++程序員.


After 4.0

“千呼萬喚始出來”,在c# 4.0中微軟終于增加了這個功能。

新的代碼如下,簡潔多了。


static void Main(string[] args)
{
    OldFun("GreenerycnDemo"); 
    OldFun("GreenerycnDemo", "abc"); 
    OldFun("greenerycn", "cnblogs", "com");
}

static void OldFun( string param1, 
                    string param2 = "default param2", 
                    string param3 = "default param3")
{
    var content = string.Format("{0},{1},{2}", param1, param2, param3);
    Console.WriteLine(content);
}
執行后如圖:


optionalParameter

注意:帶默認值的參數必須放到參數列表最后面,即不能用如下的方法,否則編譯不過


static void OldFun(string param2 = "default param2", 
                   string param1, 
                   string param3 = "default param3")
{
    var content = string.Format("{0},{1},{2}",param1,param2,param3);
    Console.WriteLine(content);
}
編譯失敗:


optionalParameterMustAfterAllRequiredParameters

背后的故事

這么方便的功能,那微軟到底做了啥呢?用Reflector看一下:


private static void OldFun(string param1, 
    [Optional, DefaultParameterValue("default param2")] string param2, 
    [Optional, DefaultParameterValue("default param3")] string param3)
{
    Console.WriteLine(string.Format("{0},{1},{2}", param1, param2, param3));
}
哈哈,原來就是在參數簽名加了Optional和DefaultParameterValue兩個屬性啊。


這兩個屬性在System.Runtime.InteropServices命名空間 下:

資料說:根據這個原理,前面提到可選參數必須放后面的代碼可以自己指定這兩個屬性,這樣編譯就沒問題了。但是我親自實踐不可以,調用時還是會報錯。

invalidCall


分享到: 更多
藍客門戶
©2001-2019 中國藍客聯盟 版權所有.
關于藍客聯盟歷史宗旨章程技術服務聯系我們藍客社區

云南11选5遗漏