Испытание различного поведения между инициализацией объекта в объявлении и инициализацией в конструкторе
Это приложение 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);
}
}
Ответы
Ответ 1
Я думал, что эти два стиля инициализации объекта были идентичны, но, похоже, это не так.
Не совсем.
В первом случае конструктор CameraWrapper
вызывается после конструктора базового класса для Form
. Во втором случае вызывается конструктор CameraWrapper
, затем конструктор базового класса, затем тело конструктора Form1
.
Возможно, что-то внутри конструктора Form
влияет на выполнение конструктора CameraWrapper
.