2013-03-19 90 views
1

由於MulticastDelegate被統治階級委託的.NET我想問一下,有沒有用例使用Delegate類?使用情況Delegate類

我的意思是,如果我有Delegate類型的變量和MulticastDelegate類型的另外一個不同的方法overriddes(如GetInvocationList)將被調用,但如果定義的委託每一個程序員從MulticastDelegate繼承,這可能是使用Delegate點類?

如果我認爲沒有,那麼不應該用ObsoleteAttribute標記,並且使用MulticastDelegate來代替它?

或者不應該靜默編譯器將「Delegate variable1;」更改爲「MulticastDelegate variable1;」?

+0

你應該幾乎從不直接使用'Delegate'或'MulticastDelegate'類型。定義實際上是兩種類型的任何特定的代表(一個'MulticastDelegate'是子類型Delegate'的'),但你應該永遠只能是指由委託其具體類型,與定義的簽名。 – Servy 2013-03-19 14:00:56

+0

但是通用的代表列表,例如我將使用List 那裏,因爲我不知道方法簽名 – user1121956 2013-03-19 14:02:14

+0

@ user1121956:這會給您帶來什麼好處,而不是'List '? – 2013-03-19 14:03:34

回答

4

這不是過時了,我看不出有任何理由將其標記爲此類。

如果您需要的唯一成員是由Delegate提供,那麼爲什麼要使用MulticastDelegate

根據我的經驗,Delegate在.NET API中的出現次數要比MulticastDelegate的「任何代表」都要多。例如:

這絕對只是由於歷史的偶然,這兩個類都存在,但是這是沒有理由棄用的只是Delegate用途。

此外,你寫的:

我的意思是,如果我有型代表的變量和類型MulticastDelegate的另一個不同的方法重載(如GetInvocationList)將被稱爲

沒有, GetInvocationList未超載。它的overriddenMulticastDelegate,但沒有超載。哦,注意方法的返回類型 - 這是Delegate[],不MulticastDelegate[]

+0

確定它被覆蓋不超載,我錯誤地輸入了這個快速,愚蠢的錯誤XD – user1121956 2013-03-19 14:36:28

+0

,這正是我的觀點,如果我調用了MulticastDelegate類型的GetInvocationList類型,我將得到不同於Delegate類型的結果,並且對於希望爲'(int i ...)列表執行''列表 [i] .DynamicInvoke(arg_list [i])' – user1121956 2013-03-19 14:39:07

+0

@ user1121956:不,你*不會*得到不同的結果,正好*因爲*被覆蓋。無論如何,「MulticastDelegate」實現將被調用。 'foo.GetInvocationList()'將執行完全相同的代碼,無論編譯時類型的'foo'是'MulticastDelegate'還是'Delegate'。如果你不相信,你需要修改你對虛擬方法工作原理的理解。 – 2013-03-19 15:12:13