老实说......我不知道我做错了什么......我得到了错误
对象引用未设置为对象的实例
代码如下所示,我使用/////
标记了错误。
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");
}
}
}
一些帮助将不胜感激。
答案 0 :(得分:11)
问题是这个
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
}
}
答案 1 :(得分:2)
在构造函数中,您没有将DinnerFun
对象放在您在表单中声明的dinnerFun
成员中。您正在构造函数中创建另一个具有相同名称的局部变量。当您稍后尝试使用该成员时,它仍将为null。
只需从赋值中删除变量声明:
public Form1() {
InitializeComponent();
dinnerFun = new DinnerFun { PeepQty = (int)nudPeepQty.Value };
}
答案 2 :(得分:1)
在Form1()构造函数中,您将重新声明dinnerFun变量。这只会有本地范围和会员级别的晚餐,因此永远不会出现。
应该是:
public Form1()
{
InitializeComponent();
dinnerFun = new DinnerFun { PeepQty = (int)nudPeepQty.Value };
}