问题 在声明中的对象初始化与构造函数中的初始化之间遇到不同的行为


这是一个WinForms C#应用程序。 以下两个snippits显示了两种不同的初始化对象的方法。他们给出了不同的结果。

这按预期工作:

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);
    }
}

3315
2017-10-23 17:35


起源

发布一些代码可能会有所帮助 CameraWrapper  - 上面的代码应该起到类似的作用。 - Tejs
罗伯特,我测试了你的假设和 CameraWrapper 两种情况下的构造函数都被调用一次。 - Gareth
那么,您的表单是否附加到CameraWrapper上的事件中?无论您触发哪种构造函数版本,您的camerawrapper事件都会触发吗? - Tejs
不,表格没有附加到活动中 CameraWrapper。中的事件处理程序 CameraWrapper 只有在我初始化时才会触发 CameraWrapper 在主窗体的构造函数中。 - Gareth


答案:


我认为这两种对象初始化样式是相同的,但似乎并非如此。

不完全的。

在第一种情况下, CameraWrapper 构造函数被调用  的基类构造函数 Form。在第二种情况下, CameraWrapper 构造函数被调用, 然后 基类构造函数,然后是 Form1 构造函数体。

它可能是内在的东西 Form 构造函数会影响执行 CameraWrapper 构造函数。


11
2017-10-23 17:39