2010-09-26 128 views
1

C#中是否有可能將一個委託或事件傳遞給一個方法,以便該方法可以爲該委託分配一個新的事件處理函數並使用+=(而不是使該方法可以調用該委託)?傳遞一個委託本身作爲參數

可以說我可以將C++與C#混合使用。這將是我正在尋找:

public class MyClass 
{ 
    public Action* actionPtr; 

    public void Assign(Action* action) 
    { 
     actionPtr = action; 
     (*action) += SomeMethod; 
    } 

    public void Unassign() 
    { 
     (*action) -= SomeMethod; 
    } 

    void SomeMethod() 
    { 
     // Do stuff 
    } 
} 

希望它是有道理的。

+0

最好退一步,解釋一下你在這裏試圖解決的問題。你的問題現在有點棘手。 – spender 2010-09-26 01:58:53

+0

沒關係,我想通了。我只需要通過它作爲參考。不管怎麼說,還是要謝謝你。 – Juan 2010-09-26 02:00:22

回答

3

事件:(除非你在事件定義的類中)。這由C#編譯器強制執行。

普通老代表:。將它作爲參數ref傳遞。

(想想這樣說:你怎麼添加一個處理程序委託你使用+=,右這是一個分配運營商,這是靜態的:你要分配委託到一個新的委託實例包括指定給+=的右側,就像x += 1方法分配xx + 1,唯一的時間就可以永遠分配外部變量從一個方法中的新的值或對象的,當它被作爲一個ref,或者傳遞out參數)。

例如,下面的代碼葉list不變:

List<int> list = null; 

InitializeListImproperly(list); 

static void InitializeListImproperly(List<int> x) 
{ 
    // x is a local variable, so this does nothing to the list variable 
    // outside this scope! 
    x = new List<int> { 1, 2, 3 }; 
} 

下將其分配給一個新的List<int>

List<int> list = null; 

InitializeListProperly(ref list); 

static void InitializeListProperly(ref List<int> x) 
{ 
    x = new List<int> { 1, 2, 3 }; 
} 

這是同樣的原理。

+0

我想通過代理作爲'ref'的東西,但是還有一種方法來保留它的副本,以便我可以稍後用' - ='取消它的分配? – Juan 2010-09-26 02:30:03

+0

@ jsoldi:保留一份什麼? – 2010-09-26 02:34:10

+0

那麼,如果我使用'+ ='將一個新的事件處理程序分配給一個委託,那麼當我完成正確的時候,我需要取消分配它?所以如果我不想用與'ref'參數相同的方法取消分配它,以後有什麼辦法可以取消分配嗎?就好像我會保留一個指向委託的指針(而不是由委託調用的方法)。 – Juan 2010-09-26 02:40:40