Как получить копию объекта - PullRequest
0 голосов
/ 05 мая 2018

У меня есть список, что-то вроде этого «Список <Блок>». Я хочу получить блок, который совпадает с блоком в списке, а не с объектом в списке. И сделайте модификацию купола с блоком и получите еще один.

Но проблема в том, что после получения блока три раза (длина списка которого равна 3) четвертый блок уже был изменен. Я перепробовал все известные мне способы, даже использовал «новый», он просто получал объект в списке, а не тот же.

Так как это решить?

Вот мой код:

//This is the list which length is 3
private List<BlockType> blocks;

//At the beginning it was like this but not work
//private List<Block> blocks;

//In a function to get a block type randomly
int blockNum = rand.Next(0, 3); //rand is a Random type
this.cBlock = new Block(blocks[blockNum]); //cBlock is object which I use to do something about the block

//The class Block goes to
class Block
{
    private List<Rectangle> _block;
    public List<Rectangle> block
    {
        get { return _block; }
    }

    private int _blockNum;
    public int blockNum
    {
        get { return _blockNum; }
    }

    public Block()
    {

    }

    public Block(int blockNum, List<Rectangle> block)
    {
        this._block = block;
        this._blockNum = blockNum;
    }

    public Block(BlockType block)
    {
        this._block = block.block;
        this._blockNum = block.blockNum;
    }
}

//And the BlockType is what I tried but does not work
class BlockType
{
    private List<Rectangle> _block;
    public List<Rectangle> block
    {
        get { return _block; }
    }

    private int _blockNum;
    public int blockNum
    {
        get { return _blockNum; }
    }

    public BlockType()
    {

    }

    public BlockType(int blockNum, List<Rectangle> block)
    {
        this._block = block;
        this._blockNum = blockNum;
    }
}

1 Ответ

0 голосов
/ 05 мая 2018

EDIT:

OP ошибочно принимал новый экземпляр Block как экземпляр, извлекаемый из List<Block>, поскольку List<Rectangle> не был клонирован в конструкторе копирования, а просто назначен, что привело к двум уникальным экземплярам Block, ссылающимся на то же самое List<Rectangle>.

Правильный конструктор копирования в этом случае будет:

public Block(Block originalBlock)
{
    this._block = new List<Rectangle>(originalBlock.block);
    this._blockNum = originalBlock.blockNum;
}

Для чего требуется аналогичный конструктор копирования в классе Rectangle.


Это должно работать для вас:

public class Block
{
    private List<Rectangle> _block;
    public List<Rectangle> block
    {
        get { return _block; }
    }

    private int _blockNum;
    public int blockNum
    {
        get { return _blockNum; }
    }

    // Copy constructor
    public Block(Block originalBlock)
    {
        // IMPORTANT: This does not create a new List<Rectangle>! See EDIT
        this._block = originalBlock.block;

        this._blockNum = originalBlock.blockNum;
    }
}

Использование:

Block originalBlock = new Block();

// Returns a new instance of Block with similar member data.
Block copiedBlock = new Block(originalBlock);

Прочтите Как: написать конструктор копирования (Руководство по программированию в C #) | Документы Microsoft

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...