私は現在、c++ から c# への移行を行っており、次の問題を提示しましたが、c# 内で実行できるような最もかすかなアイデアはありません。
typedef void (CALLBACK *funtion1)(int a , int b);
void SetCallBackFuntion(funtion1 pfn);
void something(){
obj->SetCallBackFuntion(&funtion1);
}
C#で同等の動作を実現するには、C#をどのように機能させたいか、およびターゲットにしている.NETのバージョンに応じていくつかの方法があります。最も簡単な方法は、アクションを使用することです。
C#標準を使用してこれを実装するには、メソッドよりもプロパティとしての方が適していることに最初に注意する必要があります。また、コールバックは値を返さないため、関数ではなくメソッドと呼ばれます。したがって、上記のコードは次のようになります。
public Action<int,int> CallBack { set; }
public void Something()
{
obj.CallBack = function1;
}
そして、コールバックを呼び出すコードは次のようになります。
if(CallBack != null)
CallBack(1, 2);
もう1つのアプローチは、デリゲートを使用することです。これは、アクションを説明するためのもう少し冗長な方法であり、古いバージョンの.NETと互換性があります。また、C++コードとより密接に変換されます。注:これは技術的には機能しますが(残りを正しく実装したと仮定して)、通常は良い習慣とは見なされません。早くて汚い方法をお見せしたかっただけです。
public delegate void CallBack(int x, int y);
private void SetCallBackFuntion(CallBack pfn)
{
}
private void Something()
{
obj.SetCallBackFuntion(funtion1);
}
3番目のアプローチは、インターフェースを使用することです。次のように、メソッドシグネチャを使用してインターフェイスを記述できます。
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# で簡単に記述できます