非应引用的地方

时间:2019-02-22 13:42:17

标签: c# reference

我有一堂课叫董事会。它具有多个列,您可以通过调用AddStoneToColumn(column c)将Stones添加到列中。该方法不应该修改对象本身,而只能使用添加的石头创建一个新的Board Object,但是它也会以某种方式不断改变自身。

这里是我的相关代码:

public Board AddStoneToColumn(int column)
{
    Board resultBoard = new Board(this);
    Boolean isPlaced = false;
    for (int i = 0; i < height; i++)
    {
        if (resultBoard.GetStone(column, i) == StoneEnum.EMPTY)
        {
            resultBoard.SetExactCoords(column, i, turn);
            isPlaced = true;
            break;
        }
    }

    if (!isPlaced)
    {
        throw new InvalidOperationException("Spalte voll");
    }

    if (turn == StoneEnum.BLUE)
        resultBoard.turn = StoneEnum.RED;
    if (turn == StoneEnum.RED)
        resultBoard.turn = StoneEnum.BLUE;
    return resultBoard;
}

private void SetExactCoords(int x, int y, StoneEnum stone)
{
    if (stone == StoneEnum.EMPTY)
        throw new NotSupportedException("Empty stone ??");
    this.stones[x, y] = stone;
}

public Board(Board board)
{
    this.stones = board.stones;
    this.turn = board.turn;
}

2 个答案:

答案 0 :(得分:3)

您仅在克隆构造函数中复制引用,而不创建数据副本。您将不得不复制这些数组/集合。

答案 1 :(得分:0)

也许您可以使用结构代替类?

但是对于您的示例,我会使用 ICloneable界面。

此外,您也可以观看此discussion