Перемещение объектов внутри массивов - PullRequest
0 голосов
/ 02 февраля 2009

Я пытаюсь сделать тетрис-подобную игру в XNA, и в настоящее время я думаю о том, как лучше всего с ней справиться.

Это то, что я имею до сих пор: У меня есть класс с именем Block, который имеет, например, текстуру и цветовой оттенок.

Тогда я планировал собрать все в двойной массив, например:

Block[,] blocks = new Block[10,20];

, которая тогда будет полной сеткой.

А потом, когда блоки двигались вниз, я думал о том, чтобы сделать так:

blocks[x,y+1] = blocks[x,y];

blocks[x,y] = null;

Сначала я думал, что это хорошая идея, но теперь, когда я думал, я не так уверен. Как это работает с памятью и тому подобное? Создает ли он новый объект каждый раз, когда я это делаю или как? Может кто-нибудь объяснить, как это на самом деле работает, когда я перемещаю объект внутри массива?

Я на самом деле не ищу конкретного ответа на тетрис, мне просто интересно, как он на самом деле работает.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 02 февраля 2009

Нет, вы просто перемещаете указатели. Когда вы говорите:

blocks[x,y+1] = blocks[x,y];

что вы по сути делаете, это меняете указатель. Объект останется именно там, где он есть, но теперь вместо индекса x, y он будет с индексом x, y + 1. Когда вы говорите

blocks[x,y] = null;

там вы удаляете ссылку на объект x, y, и если ничто не удерживает ссылку, сборщик мусора очистит ее.

1 голос
/ 03 февраля 2009

Первый ответ выше почти верен, но назначение не меняет местами указатель, оно дублирует его. После первой строки кода есть две ссылки на объект, на который изначально ссылаются блоки [x, y]. При нулевом присваивании исходная ссылка удаляется, но новая ссылка остается в блоках [x, y + 1]. Обнулите этот объект и объект кучи будет честной игрой для GC.

0 голосов
/ 02 февраля 2009

Если бы вы хранили типы значений (например, int, string) внутри вашего массива, вы действительно создавали бы копию данных каждый раз, когда копировали значение, потому что типы значений неизменны в C #. Поскольку вы храните класс (который является ссылочным типом) в вашем массиве, ваш код на самом деле просто создает копию указателя, а не всего объекта.

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