Подтвердить что ты не робот

Испытание различного поведения между инициализацией объекта в объявлении и инициализацией в конструкторе

Это приложение WinForms С#. Следующие два фрагмента показывают два разных способа инициализации объекта. Они дают разные результаты.

Это работает как ожидалось:

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 обработчик события никогда не вызывается.

Я думал, что эти два стиля инициализации объекта были идентичны, но, похоже, это не так. Зачем?

Вот весь класс 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);
    }
}
4b9b3361

Ответ 1

Я думал, что эти два стиля инициализации объекта были идентичны, но, похоже, это не так.

Не совсем.

В первом случае конструктор CameraWrapper вызывается после конструктора базового класса для Form. Во втором случае вызывается конструктор CameraWrapper, затем конструктор базового класса, затем тело конструктора Form1.

Возможно, что-то внутри конструктора Form влияет на выполнение конструктора CameraWrapper.