C# 在窗体构造函数中初始化的对象为空

C# 在窗体构造函数中初始化的对象为空,c#,winforms,class,constructor,null,C#,Winforms,Class,Constructor,Null,表单初始化中的对象图表设置有问题 这是我自己的课程,添加到下面的Form1code: public partial class Form1 : Form { public Form1(bool archivePlotPreview) { InitializeComponent(); ChartSettings chartOne = new ChartSettings(this.chart1, archivePlotPreview); }

表单初始化中的对象图表设置有问题

这是我自己的课程,添加到下面的
Form1
code:

public partial class Form1 : Form
{


    public Form1(bool archivePlotPreview)
    {
        InitializeComponent();
        ChartSettings chartOne = new ChartSettings(this.chart1, archivePlotPreview);
    }

    public ChartSettings chartOne;

    //Form1 variables and functions
}

public class ChartSettings
{

    public ChartSettings(Chart settingsRelatedChart, bool archivePlotPreview)
    {
        // przypisanie wykresu do ktorego odnosza sie ustawienia
        ChartObject = settingsRelatedChart;
        ChartObject.MouseMove += new System.Windows.Forms.MouseEventHandler(this.chart1_MouseMove);

        barchivePlotPreview = archivePlotPreview;

    }

    // other variables and functions
}
创建此类的原因是需要与图表对象(在设计器窗口中添加的图表1)相关的其他变量,如CSV保存选项、最小/最大标记选项等。因此,在Form1的构造函数中,我添加了创建图表设置对象的行,如上所示。它将chart1分配给它,在进一步的代码中,我想使用chartOne.ChartObject而不是this.chart1

当我创建新的Form1实例时,会显示一个窗口,chart1可见,等等。但当我按下“加载数据”按钮,在其中使用chartOne.ChartObjectreference时,它会崩溃,因为chartOne为空:/Direct操作在此上。chart1似乎正常。 当我调试代码时,chartOne是在构造函数中创建的,不是null,但当我按下上面提到的按钮时,它的行为与上面的一样。
为什么我的chartOne在两者之间消失了?该如何正确地完成呢?

您不是在初始化属性
ChartSettings chartOne
,而是在构造函数内创建一个实例,当构造函数完成时,它将被释放。这意味着您从未初始化过类级属性chartOne;因此,它将始终为空

使用this.chartOne时,您声明要使用类中定义的属性

改成,

public ChartSettings chartOne{ get; set;}

public Form1(bool archivePlotPreview)
{
    InitializeComponent();
    chartOne = new ChartSettings(this.chart1, archivePlotPreview);
}

您不是在初始化属性
ChartSettings chartOne
,而是在构造函数内创建一个实例,它将在构造函数完成时被释放。这意味着您从未初始化过类级属性chartOne;因此,它将始终为空

使用this.chartOne时,您声明要使用类中定义的属性

改成,

public ChartSettings chartOne{ get; set;}

public Form1(bool archivePlotPreview)
{
    InitializeComponent();
    chartOne = new ChartSettings(this.chart1, archivePlotPreview);
}

在构造函数中创建的ChartSettings chartOne与在类中声明的全局对象不同。构造函数中的ChartSettings chartOne仅在该范围内可用,因此类的ChartSettings chartOne保持为空。

在构造函数中创建的ChartSettings chartOne与在类中声明的全局对象不同。构造函数中的ChartSettings chartOne仅在该范围内可用,因此该类的ChartSettings chartOne保持为空。

也许可以将
chartOne
声明在ctor之外,以便OP可以看到..?:)@达雅啊,我真傻。。它是在下面宣布的。旁注:在ctor上面声明变量:)@SimonWhitehead我已经更改了答案:)我应该在声明中添加{get;set;}吗?我已经看到,这与单变量有关。我的图表设置是布尔值、整数、图表等的集合。它到底起什么作用?虽然这是一种最佳实践,但并不需要它。也许可以在ctor外部声明
chartOne
,以便OP可以看到..?:)@达雅啊,我真傻。。它是在下面宣布的。旁注:在ctor上面声明变量:)@SimonWhitehead我已经更改了答案:)我应该在声明中添加{get;set;}吗?我已经看到,这与单变量有关。我的图表设置是布尔值、整数、图表等的集合。它到底做什么?它不是必需的,尽管它是一种最佳实践。