[英]Noob Concern: Object reference not set to an instance of an object… 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 };
}
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字段。
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
成员中。 您正在构造函数中创建另一个具有相同名称的局部变量。 当您以后尝试使用该成员时,它仍然为空。
只需从分配中删除变量声明即可:
public Form1() {
InitializeComponent();
dinnerFun = new DinnerFun { PeepQty = (int)nudPeepQty.Value };
}
在Form1()构造函数中,您将重新声明DinnerFun变量。 这将仅具有本地范围,并且会员级别的晚餐将因此而无法启动。
应该:
public Form1()
{
InitializeComponent();
dinnerFun = new DinnerFun { PeepQty = (int)nudPeepQty.Value };
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.