2012-08-14 70 views
1

我目前做的C++遷移到C#和我提出以下問題,我有一點兒也不知道這可C#之內完成遷移C++到C#(調)

typedef void (CALLBACK *funtion1)(int a , int b); 

void SetCallBackFuntion(funtion1 pfn); 


void something(){ 

obj->SetCallBackFuntion(&funtion1); 

} 
+0

你想從**調用**這段代碼? – gideon 2012-08-14 05:28:52

+0

是的,我想知道如何寫在C# – Ivanrlg 2012-08-14 05:32:07

+1

不,有一個區別。你有一個這樣的代碼的C++庫,你想**從C#調用**。或者,你想**編寫等效的C#代碼** ?? – gideon 2012-08-14 05:36:46

回答

0

它可以簡單地用C#編寫代表

1

有幾種方法可以在C#中實現平等行爲,具體取決於您希望如何工作以及您的目標.NET版本。最簡單的方法是使用Action

要使用C#標準實現這一點,首先應該注意的是,它更適合作爲屬性而不是方法。另外,因爲回調沒有返回值,所以它被稱爲方法,而不是函數。所以上面的代碼會是這個樣子:

public Action<int,int> CallBack { set; } 

public void Something() 
{ 
    obj.CallBack = function1; 
} 

和代碼來調用回調會做這樣的事:

if(CallBack != null) 
    CallBack(1, 2); 

另一種方法是使用delegate,這僅僅是一個稍微描述一個Action的更詳細的方式,並且與舊版本的.NET兼容。它還與C++代碼更緊密地轉換。注意:雖然這在技術上會起作用(假設您正確地執行了其餘部分),但這通常不被視爲良好做法。我只想告訴你一個快速和骯髒的方式。

public delegate void CallBack(int x, int y); 

private void SetCallBackFuntion(CallBack pfn) 
{ 
} 

private void Something() 
{ 
    obj.SetCallBackFuntion(funtion1); 
} 

第三種方法是使用接口。你能描述的接口與方法的簽名是這樣的:

public interface IMyInterface 
{ 
    void CallBack(int x, int y); 
} 

,然後你可以有你的類類似行動的性質,但使用該接口來代替。

public IMyInterface CallBackObject { set; } 

public void Something() 
{ 
    obj.CallBackObject = someObject; 
} 

if(CallBackObject != null) 
    CallBackObject.CallBack(1, 2); 

,想到最後的辦法是使用事件處理程序,但因爲它們是當你有多個用戶到您的回調更有用,我不會在這裏覆蓋。

+0

好的,非常感謝您抽出時間來幫助我的朋友,我是新來的編程在C#中。來自委內瑞拉的問候。 – Ivanrlg 2012-08-14 13:13:55