我目前做的C++遷移到C#和我提出以下問題,我有一點兒也不知道這可C#之內完成遷移C++到C#(調)
typedef void (CALLBACK *funtion1)(int a , int b);
void SetCallBackFuntion(funtion1 pfn);
void something(){
obj->SetCallBackFuntion(&funtion1);
}
我目前做的C++遷移到C#和我提出以下問題,我有一點兒也不知道這可C#之內完成遷移C++到C#(調)
typedef void (CALLBACK *funtion1)(int a , int b);
void SetCallBackFuntion(funtion1 pfn);
void something(){
obj->SetCallBackFuntion(&funtion1);
}
它可以簡單地用C#編寫代表
有幾種方法可以在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);
,想到最後的辦法是使用事件處理程序,但因爲它們是當你有多個用戶到您的回調更有用,我不會在這裏覆蓋。
好的,非常感謝您抽出時間來幫助我的朋友,我是新來的編程在C#中。來自委內瑞拉的問候。 – Ivanrlg 2012-08-14 13:13:55
你想從**調用**這段代碼? – gideon 2012-08-14 05:28:52
是的,我想知道如何寫在C# – Ivanrlg 2012-08-14 05:32:07
不,有一個區別。你有一個這樣的代碼的C++庫,你想**從C#調用**。或者,你想**編寫等效的C#代碼** ?? – gideon 2012-08-14 05:36:46