传递参考文献

时间:2011-03-28 11:24:48

标签: c# object reference

我想知道将引用从类传递给类的好方法。

基本上我的支票代码中有两个类:

一个是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

2 个答案:

答案 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对象中没有空指针吗?