2009-11-05 78 views
0

在C或C++,可以使用函數指針作爲參數傳遞給另一個這樣的功能:如果方法使用另一個類的委託參數作爲函數參數。

int example(FUNPTR a) 
{ 
    /* call the function inside */ 
    a(); 
} 

而且我也知道,我們可以在C#中使用委託作爲函數指針,但什麼 我想分配給另一個類中存在的委託,這是否意味着這兩個類都需要有相同的委託聲明?

例如:

class a 
{ 
    public delegate void processData(Byte[] data); 

    public void receivData(ProcessData dataHandler) 
    { 
     NetworkStream stream; 
     Byte[] data_buffer = new Byte[100]; 

     /* receive data from socket interface */ 

     stream.Read(data_buffer, 0, data_buffer.Length); 

     dataHandler(data); 
    } 
} 

另外,我想用這個receivData功能class b這樣的:

class b 
{ 

    public delegate void processData(Byte[] data); 

    class a = new a(); 

    a.receivData(new processData(b.dataHandler)); 

    public void dataHandler(Byte[] array) 
    { 
     /* handling of the array*/ 
    } 
} 

請讓我知道如果processDataclass b的聲明是必要的。

這是在C#中傳遞函數指針的正確方法嗎?

回答

3

你不需要委託類型的多個聲明,而事實上,這將導致在你的榜樣的問題。

a.receiveData期待a.processData類型的委託。但是當你在b中新建一個processData委託時,它會找到b.processData類型 - 這是一個不同的類型(即使它具有相同的簽名)。

所以,你應該刪除從B委託類型聲明,您的電話更改爲:

a.receivData(new a.processData(b.dataHandler)); 

但事實上,明確新的不必要的:因爲b.dataHandler具有正確的簽名,C#編譯器會插入一個隱式轉換到a.processData,所以你可以寫:

a.receivData(b.dataHandler); 
0

是的,此方法應具有相同的簽名

+0

感謝您的答覆。有沒有更好的方式來做到這一點。不得不在不同的類中聲明相同的代表聽起來多餘。 – alex 2009-11-05 01:34:10

相關問題