Noob Concern:对象引用未设置为对象的实例... C#

时间:2011-10-14 00:09:13

标签: 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"); 
        }
    }
}

一些帮助将不胜感激。

3 个答案:

答案 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 }; 
}