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

Mon*_*an5 1 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"); 
    }
}
Run Code Online (Sandbox Code Playgroud)

}

这是我正在做的这个练习项目的另一页代码:

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"); 
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

一些帮助将不胜感激.

Ant*_*ram 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
Run Code Online (Sandbox Code Playgroud)

您已在类级别声明了一个变量,但是没有实例化它,您在构造函数中声明并初始化一个具有相同名称的局部变量.修复它很简单,只需从构造函数中删除声明,只需实例化它即可.

    public Form1()
    {
        InitializeComponent();
        dinnerFun = new DinnerFun { PeepQty = (int)nudPeepQty.Value }; 
        // ^^^ instantiates class field
    }
Run Code Online (Sandbox Code Playgroud)

这暴露了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
     }
}
Run Code Online (Sandbox Code Playgroud)