Noob问题:对象引用未设置为对象的实例..C#
本文关键字:对象 实例 设置 问题 对象引用 Noob | 更新日期: 2023-09-27 18:11:25
老实说。。。我不知道自己做错了什么。。。我得到错误
对象引用未设置为对象的实例
代码如下所示,我已经使用/////
标记了错误。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace MonuEventPlanning
{
public partial class Form1 : Form
{
DinnerFun dinnerFun;
public Form1()
{
InitializeComponent();
DinnerFun dinnerFun = new DinnerFun { PeepQty = (int)nudPeepQty.Value };
}
public void btnCalc_Click(object sender, EventArgs e)
{
dinnerFun.CalcDrinks(cbxHealthy.Checked); ///////PROBLEM HERE////////////////
dinnerFun.CalcDecorations(cbxFancy.Checked);
DisplayCost();
}
public void DisplayCost()
{
tbxDisplayCost.Text = dinnerFun.CalcTotalCost(cbxHealthy.Checked).ToString("c");
}
}
}
这是我正在做的这个练习项目的另一页代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace MonuEventPlanning
{
public partial class Form1 : Form
{
DinnerFun dinnerFun;
public Form1()
{
InitializeComponent();
DinnerFun dinnerFun = new DinnerFun { PeepQty = (int)nudPeepQty.Value }; //This object is instantiated again? Or is this the same dinnerFun from above?
}
public void btnCalc_Click(object sender, EventArgs e)
{
dinnerFun.CalcDrinks(cbxHealthy.Checked);
dinnerFun.CalcDecorations(cbxFancy.Checked);
DisplayCost();
}
public void DisplayCost()
{
tbxDisplayCost.Text = dinnerFun.CalcTotalCost(cbxHealthy.Checked).ToString("c");
}
}
}
如有帮助,不胜感激。
问题是这个
namespace MonuEventPlanning
{
public partial class Form1 : Form
{
DinnerFun dinnerFun; // class level field declared here
public Form1()
{
InitializeComponent();
DinnerFun dinnerFun = new DinnerFun { PeepQty = (int)nudPeepQty.Value };
// ^^^ local declaration, is NOT member field
}
public void btnCalc_Click(object sender, EventArgs e)
{
dinnerFun.CalcDrinks(cbxHealthy.Checked); // this is the member field, never instantiated
您已经在类级别声明了一个变量,但没有实例化它,而是在构造函数中声明并初始化了一个同名的局部变量。修复起来很简单,只需从构造函数中删除声明,只需实例化即可。
public Form1()
{
InitializeComponent();
dinnerFun = new DinnerFun { PeepQty = (int)nudPeepQty.Value };
// ^^^ instantiates class field
}
这暴露了C#的一个特性。允许局部变量和参数与类的成员字段具有相同的名称。当遇到这种情况时,可以通过this
修饰符引用类字段。
class Foo
{
string bar;
int baz;
public Foo(string bar)
{
this.bar = bar;
// ---^ class field
// ---------^ parameter
int baz = 42; // local
this.baz = baz; // assigns local value to class field
}
}
在构造函数中,您没有将DinnerFun
对象放在表单中声明的dinnerFun
成员中。您正在构造函数中创建另一个同名的局部变量。当您稍后尝试使用该成员时,它仍然为null。
只需从赋值中删除变量声明:
public Form1() {
InitializeComponent();
dinnerFun = new DinnerFun { PeepQty = (int)nudPeepQty.Value };
}
在Form1((构造函数中,您正在重新定义dinnerFun变量。这将只在本地范围内进行,因此会员级别的晚餐乐趣将永远不会启动。
应为:
public Form1()
{
InitializeComponent();
dinnerFun = new DinnerFun { PeepQty = (int)nudPeepQty.Value };
}