11

これは WinForms C# アプリケーションです。次の 2 つのスニペットは、オブジェクトを初期化する 2 つの異なる方法を示しています。それらは異なる結果をもたらしています。

これは期待どおりに機能します。

public partial class Form1 : Form
{
  private CameraWrapper cam;
  public Form1()
  {
       cam = new CameraWrapper();
       InitializeComponent();           
  }

これは機能しません (詳細は以下):

public partial class Form1 : Form
{
  private CameraWrapper cam = new CameraWrapper();
  public Form1()
  {
       InitializeComponent();
  }

内部CameraWrapperでは、サードパーティの SDK を使用してカメラと通信しています。結果が利用可能になったときに呼び出される SDK のイベントに登録します。

ケース 1 (コンストラクター内の初期化) では、すべてが期待どおりに機能し、内部のイベント ハンドラーCameraWrapperが呼び出されます。ケース 2 では、イベント ハンドラーは呼び出されません。

これら 2 つのオブジェクト初期化スタイルは同じだと思っていましたが、そうではないようです。なんで?

CameraWrapperこれがクラス全体です。イベント ハンドラは、 への呼び出しの後に呼び出される必要がありますTrigger

class CameraWrapper
{
    private Cognex.DataMan.SDK.DataManSystem ds;
    public CameraWrapper()
    {
        ds = new DataManSystem();
        DataManConnectionParams connectionParams = new DataManConnectionParams("10.10.191.187");
        ds.Connect(connectionParams);

        ds.DmccResponseArrived += new DataManSystem.DmccResponseArrivedEventHandler(ds_DmccResponseArrived);
    }

    public void Trigger()
    {
        SendCommand("TRIGGER ON");
    }

    void ds_DmccResponseArrived(object sender, DmccResponseArrivedEventArgs e)
    {
        System.Console.Write("Num barcodes: ");
        System.Console.WriteLine(e.Data.Length.ToString());
    }

    void SendCommand(string command)
    {
        const string cmdHeader = "||>";
        ds.SendDmcc(cmdHeader + command);
    }
}
4

1 に答える 1

11

これら 2 つのオブジェクト初期化スタイルは同じだと思っていましたが、そうではないようです。

そうではありません。

最初のケースでは、コンストラクターはの基本クラス コンストラクターのCameraWrapperに呼び出されます。2 番目のケースでは、コンストラクターが呼び出され、次に基底クラス コンストラクター、コンストラクター本体が呼び出されます。FormCameraWrapperForm1

コンストラクター内の何かがFormコンストラクターの実行に影響を与える可能性がありCameraWrapperます。

于 2012-10-23T17:39:03.930 に答える