我想知道将引用从类传递给类的好方法。
基本上我的支票代码中有两个类:
一个是Checker游戏代码..
class CheckersCode
{
IchecherMove[,] pieces;
public static int counter;
Checkers checker;
public void ExecuteAll(int columnStart, int rowStart, int columnEnd, int rowEnd)
{
checker = new Checkers();
Game g=new Game(pieces, columnStart, rowStart, columnEnd, rowEnd);// i want this reference to be passed in the method below
g.MoveValidityManager();
checker.obtainGameReference(g);//i want this reference to be passed through this method
其他代码是表单代码:
public partial class Checkers : Form
{
public Checkers()
{
InitializeComponent();
}
CheckersCode codeFile = new CheckersCode();
private void Checkers_Load(object sender, EventArgs e)
{
chessPics = Pattern();
PrintPieces(codeFile.FirstLoad());
}
Game gameRef;
public void obtainGameReference(Game g)// i want that reference to be obtained here
{
gameRef=g;and be passed to this
}
问题是,这不起作用..当我使用gameRef参考时,它抛出一个空的点例如,例如gameRef.piecePromotion(); // nullerpointException
好的,我更新了我的问题:
如果我将对象引用设为静态,它可以工作:
public static Game gameRef;
但不是:
public Game gameRef;
会发生什么 private void a1_Click(object sender,EventArgs e) { codeFile.ExecuteAll(rowStart,columnStart,rowEnd,columnEnd); //每次我决定将一个片段移动到一个新的图片框时执行。 gameRef.piecePromotion(); //接下来执行此操作。 } 使用游戏gameRef,不是静态的,在执行一次ExcuteAll方法之后,gameRef变为null(在完成执行之前,它被分配)。
这是ExecuteAll方法:
public void ExecuteAll(int columnStart, int rowStart, int columnEnd, int rowEnd)
{
checker = new Checkers();
Game g=new Game(pieces, columnStart, rowStart, columnEnd, rowEnd);
checker.obtainGameReference(g);
g.MoveValidityManager();// calls a method for a class to be executed. no new instances of Checkers class are being created , inside the game class.
它通过代码以某种方式将gameRef重置为null。所以我检查了整个代码,如果我有新的对象创建类型Checkers(我的winform部分类)..但点击ctrl + F ..我发现只有一个实例,我创建了一个对象引用。
为什么在将gameRef指定为对象引用
之后将其重置为null我只在事件中使用gameRef ...我只实例化Game类和CheckerCode类一次..而且我不会通过代码杀死引用。我的引用仅在图片框点击事件中激活:
private void a2_Click(object sender, EventArgs e)
{
if (NextTurn)
{
columnEnd = 1;
rowEnd = 2;
codeFile.ExecuteAll(rowStart, columnStart, rowEnd, columnEnd);// it does assign the gameRef throughout the method, but at the end....
gameRef.piecePromotion();// this is reset to null after the above method finishes executing
}
我在调试模式中查看了代码..
public void obtainGameReference(Game g)
{
gameRef=g;// g is not null, it contains the object. gameRef remains a null.
}
因此,当代码继续运行几步之后。在Form类/文件(Checkers)
中 gameRef.piecePromotion(); // gameRef is null
答案 0 :(得分:1)
在某些时候看起来gameRef
在设置之前正在使用,或者它被设置为null。
由于没有一个类没有意义,我总是会有一部分类不变(必须始终为真的条件集),并在构造函数中强制执行:
private readonly Game _game;//doesn't HAVE to be readonly, but can simplify things if it is
public Checkers(Game game)
{
if(game == null)
throw new ArgumentNullException();
_game = game;
InitializeComponent();
}
我也很好奇你为什么要明确谈论“引用”。虽然正确,因为对象总是引用,所以在C#speak中谈论它们是不常见的。这让我想知道Game是否可能是一个结构,在这种情况下其他事情会出错(你可以保留对结构的引用,但是不值得维护它所需的额外工作)。
答案 1 :(得分:0)
默认情况下,.NET将通过引用传递引用类型。你确定我们的pricePromotion对象中没有空指针吗?