2011-04-29 77 views
3

我還沒有升級到4.0我會檢查自己的代碼片段。但我希望有些專家可以對此發表評論。方法重載和C#中的動態關鍵字

在以下代碼中,將在運行時調用相應的Print()方法嗎?在C#2010中這樣稱呼它是合法的嗎?

public void Test() 
{ 
    dynamic objX = InstantiateAsStringOrDouble(); 

    Print(objX); 
} 

public void Print(string s) 
{ 
    Console.Write("string"); 
} 

public void Print(double n) 
{ 
    Console.Write("double"); 
} 

謝謝!

+0

您想如何決定打印哪個打印?我想你會更好地閱讀更多關於「動態」的內容。當然,在運行時可以使用 – 2011-04-29 18:41:32

+0

。感謝您的建議,我已經這麼做了! :-) – 2011-04-29 18:57:32

+1

它確實有效,但要注意動態。它可以解決很多問題並同時給你帶來很多麻煩:-)基本上你可以獲得運行時的靈活性,但是會失去所有的編譯器時間檢查。 – 2011-04-29 19:00:56

回答

3

是的,這確實有效。它會在運行時檢查動態的使用情況並調用適當的方法,但是幾乎所有的編譯時檢查都會丟失,所以我會確保這真的是你想要做的。

+0

謝謝詹姆斯。我試圖轉換的代碼具有3-4級深度方法調用與傳遞盒裝對象參數。我想寫的重載方法,但它像一些if-else邏輯,然後一個方法調用,比其他方法調用更多的if-else邏輯(通過相同的對象參數,它從2-3級起)...疼痛遺留代碼的脖子。在底部的某個地方,它檢查對象是否是ArrayList或HashTable或者等等,並相應地執行。 – 2011-04-29 19:08:26

2

是的,你甚至可以做到這一點:

public dynamic InstantiateAsStringOrDouble() { return 0.5; } 

public dynamic InstantiateAsStringOrDouble() { return "hello"; } 

,並預期它會奏效。

+2

當然,'公開的動態... {return true; }'可能不起作用。 – 2011-04-29 19:03:48