这是一个 WinForms C# 应用程序。 以下两个片段显示了初始化对象的两种不同方式。他们给出了不同的结果。
这按预期工作:
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);
}
}
最佳答案
I thought that these two styles of object initialization were identical, but it seems not to be the case.
不完全是。
在第一种情况下,CameraWrapper
构造函数在 Form
的基类构造函数之后被调用。在第二种情况下,CameraWrapper
构造函数被调用,然后基类构造函数,然后是 Form1
构造函数主体。
Form
构造函数中的某些内容可能会影响 CameraWrapper
构造函数的执行。
关于c# - 在声明中的对象初始化与构造函数中的初始化之间经历不同的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13036107/