繁体   English   中英

Noob关注:对象引用未设置为对象的实例…C#

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM