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

如有帮助,不胜感激。

Noob问题:对象引用未设置为对象的实例..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 }; 
}