Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对象引用未设置为对象的实例?但它是吗?C#_C#_Object_Nullreferenceexception - Fatal编程技术网

对象引用未设置为对象的实例?但它是吗?C#

对象引用未设置为对象的实例?但它是吗?C#,c#,object,nullreferenceexception,C#,Object,Nullreferenceexception,这里是新手程序员。正在进行Yahtzee的游戏,但在我已经纠正错误的情况下,无法理解为什么会出现此错误(对象引用未设置为对象的实例)。我的“form”对象为null,即使我在类构造函数中声明了它的一个实例,并且出现了一条绿线,表示它未被使用 public partial class Form1: Form { public Form1() { InitializeComponent(); } private Game game; public

这里是新手程序员。正在进行Yahtzee的游戏,但在我已经纠正错误的情况下,无法理解为什么会出现此错误(对象引用未设置为对象的实例)。我的“form”对象为null,即使我在类构造函数中声明了它的一个实例,并且出现了一条绿线,表示它未被使用

public partial class Form1: Form {

    public Form1() {
        InitializeComponent();
    }

    private Game game;

    public void ShowMessage(string message) {
        lblMessage.Text = message;
    }

    public void StartNewGame() {
        game = new Game(this);

        }

    private void btnRoll_Click(object sender, EventArgs e) {
        game.RollDice();

    }

class Game {
    private Form1 form;

    public Game(Form1 form) {
        form = new Form1();

        }

    public void RollDice() {

        form.ShowMessage("blahblah");
    }

“NullReferenceException”错误出现在form.ShowMessage上,我不知道为什么。我在游戏构造函数中声明了form类的一个新实例,该实例在玩家选择StartNewName时运行,StartNewName运行StartNewName方法。最简单的方法是将“Form1 form”添加到Game类中RollDice()方法的参数中,然后在Form1事件处理程序中添加Game.RollDice(this)。但是赋值的说明说明说明我们不应该这样做,我们要在游戏的构造函数中初始化Form1对象。请帮助我,我是新手,无法理解为什么会发生这种情况。

在构造函数
游戏类中使用此选项:

public Game(Form1 form)
{
    this.form = form;

}

在构造函数
游戏类中使用此选项:

public Game(Form1 form)
{
    this.form = form;

}

您的问题是构造函数中存在命名冲突:

public Game(Form1 form)
{
    form = new Form1();
}
该参数与表单级别变量具有相同的名称。这意味着构造函数代码是
new
ing传入的变量,而不是类级别的变量。您应该使用
this
限定符引用表单变量,或者最好将其重命名

通常的做法是对类级变量使用下划线前缀:

class Game
{
    private Form1 _form;

    public Game(Form1 form) {
        _form = new Form1();

    }
}

您的问题是构造函数中存在命名冲突:

public Game(Form1 form)
{
    form = new Form1();
}
该参数与表单级别变量具有相同的名称。这意味着构造函数代码是
new
ing传入的变量,而不是类级别的变量。您应该使用
this
限定符引用表单变量,或者最好将其重命名

通常的做法是对类级变量使用下划线前缀:

class Game
{
    private Form1 _form;

    public Game(Form1 form) {
        _form = new Form1();

    }
}

您正在创建一个新表单,而不是将传入的表单分配给其局部变量

class Game {
    private Form1 form;

    public Game(Form1 form) {
        *form = new Form1();*

        }

    public void RollDice() {

        form.ShowMessage("blahblah");
    }
您应该更改代码,以便将传入的表单分配给其局部变量,如下所示:

public Game(Form1 form) {
    this.form = form;

    }

然后它应该可以工作。

您正在创建一个新表单,而不是将传入的表单分配给它的局部变量

class Game {
    private Form1 form;

    public Game(Form1 form) {
        *form = new Form1();*

        }

    public void RollDice() {

        form.ShowMessage("blahblah");
    }
您应该更改代码,以便将传入的表单分配给其局部变量,如下所示:

public Game(Form1 form) {
    this.form = form;

    }

然后它应该会工作。

不要让你的
游戏
类知道调用它的
表单。这确实限制了代码在将来的可重用性,因为现在任何试图使用
Game
类的
表单都必须调用
ShowMessage
方法

相反,只要让您的
RollDice
方法返回一个字符串

class Game
{
    public void RollDice()
    {
        // do important 'roll dice' stuff...

        return "blahblah";
    }
}
然后让您的
表单
适当地处理返回值

private void btnRoll_Click(object sender, EventArgs e)
{
    string message = game.RollDice();

    lblMessage.Text = message;
}

这完全避免了将
表单
传递到
游戏
类中的需要,避免了获取
NullReferenceException的大量机会

不要让你的
游戏
类知道调用它的
表单
。这确实限制了代码在将来的可重用性,因为现在任何试图使用
Game
类的
表单都必须调用
ShowMessage
方法

相反,只要让您的
RollDice
方法返回一个字符串

class Game
{
    public void RollDice()
    {
        // do important 'roll dice' stuff...

        return "blahblah";
    }
}
然后让您的
表单
适当地处理返回值

private void btnRoll_Click(object sender, EventArgs e)
{
    string message = game.RollDice();

    lblMessage.Text = message;
}

这完全避免了将
表单
传递到
游戏
类中的需要,并避免了获得
NullReferenceException

在何处/何时调用
StartNewName
方法?在何处/何时调用
StartNewName
方法?谢谢!谢谢你的教育,我的学校老师不能给我哈哈@AbdellahOUMGHAR不要乞求接受,这是不好的做法谢谢!谢谢你的教育,我的学校老师不能给我哈哈@AbdellahOUMGHAR不要乞求接受,这是不好的做法