新手编码器在这里。在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");
}
在Form.ShowMessage上出现“NullReferenceException”错误,我不知道为什么。我在游戏构造函数中声明了一个表单类的新实例,当玩家选择运行StartNewGame方法的StartNewGame时运行该实例。让它工作的最简单方法是简单地将“Form1表单”添加到Game类中的RollDice()方法的参数,然后在Form1事件处理程序中添加game.RollDice(this)。但是赋值的指令指出我们不应该这样做,我们要在Game的构造函数中初始化Form1对象。请帮助我是新手,不能理解为什么会这样。
答案 0 :(得分:1)
在构造函数Game Class
中使用它:
public Game(Form1 form)
{
this.form = form;
}
答案 1 :(得分:1)
您的问题是构造函数中的命名冲突:
public Game(Form1 form)
{
form = new Form1();
}
该参数与表单级变量的名称相同。这意味着构造函数代码是new
你传入的变量,而不是类级别的变量。您应该使用this
限定符引用表单变量,或者最好重命名它。
通常的做法是对类级变量使用下划线前缀:
class Game
{
private Form1 _form;
public Game(Form1 form) {
_form = new Form1();
}
}
答案 2 :(得分:0)
您正在创建新表单,而不是将传入的表单分配给其本地变量。
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;
}
然后它应该工作。
答案 3 :(得分:0)
不要让您的Game
班级了解正在调用它的Form
。这确实限制了代码在将来的可重用性,因为现在尝试使用Form
类的任何 Game
都必须使用ShowMessage
方法来调用
相反,只需让您的RollDice
方法返回一个字符串......
class Game
{
public void RollDice()
{
// do important 'roll dice' stuff...
return "blahblah";
}
}
然后让Form
正确处理返回值。
private void btnRoll_Click(object sender, EventArgs e)
{
string message = game.RollDice();
lblMessage.Text = message;
}
这完全解决了将Form
传递到Game
课程的需要,并避免了获得NullReferenceException
的大量机会。