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