C#的方法採用默認的參數時應注意版本問題

在一個項目裏引用到另一個dll中的帶有默認參數的方法時
static void Main(string[] args)
        {
            Test t = new Test();
            t.Work();
        }
在dll的最初實現爲:
 public class Test
    {
        public void Work(int a = 5, string name = "fudan")
        {
            Console.WriteLine("a:" + a + "\nname:" + name);
        }
    }
此時將會輸出:
a:5
name:fudan
但是如果dll發生變化,並進行重新編譯,而此時沒有對Main方法進行重新編譯,將會出錯。如,dll改爲:
public class Test
    {
        public void Work(int a = 10, string name = "tsing")
        {
            Console.WriteLine("a:" + a + "\nname:" + name);
        }
    }
如果main方法沒有進行重新編譯,則仍會輸出:
a:5
name:fudan
這說明默認的行爲出錯了。真正的默認行爲是:
a:5
name:fudan

原因:
    C#編譯器在編譯時,如果發現沒有給方法Work提供實參,則會對參數a與name採用默認參數,此時將在main方法上生成兩個臨時變量用將保存默認的值5與“fudan”,當方法運行時,將把這兩個臨時變量作爲參數傳送到方法Work上。因此,當重新生成新的dll時,並沒有對main方法進行重新編譯,所以,main方法傳送的參數值並沒有發生變化。爲了使得默認的行爲正確,只得重新編譯。但是這樣做並不合理,因此,最好的採用默認參數的方法是:對引用類型採用null,對值類型採用0.
如:
    public class Test
    {
        public void Work(int a = 0, string name = null)
        {
            if(a==0)a=10;
            if(name==null) name="tsing";
            Console.WriteLine("a:" + a + "\nname:" + name);
        }
    }
這樣,進行修改時,可以不用重新編譯Main方法,就可以實現默認行爲的變化。對於小的項目而言,問題不大。但是對於類庫的提供者而言,好像這個問題挺大的。
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章