Использование `<List>` при работе с указателями в C # - PullRequest
2 голосов
/ 30 марта 2010

Как я могу добавить элемент в список, если этот элемент, по сути, является указателем и избежать замены каждого элемента в моем списке на самый новый экземпляр этого элемента?

Вот что я имею в виду:
Я занимаюсь обработкой изображений, и есть шанс, что мне придется иметь дело с изображениями, которые приходят быстрее, чем я могу обработать (в течение короткого периода времени). После этого «всплеска» изображений я буду полагаться на тот факт, что могу обрабатывать быстрее, чем средняя частота изображений, и со временем «догоню».

Итак, что я хочу сделать, это поместить мои изображения в <List>, когда я их получу, тогда, если мой поток обработки не занят, я могу взять изображение из этого списка и передать его.

Моя проблема в том, что я обеспокоен тем, что, поскольку я добавляю изображение «Image1» в список, а затем заполняю «Image1» новым изображением (во время следующего получения изображения), я заменю изображение, сохраненное в списке также с новым изображением (поскольку переменная изображения на самом деле является просто указателем).

Итак, мой код выглядит примерно так: while (!exitcondition) { if(ImageAvailabe()) { Image1 = AcquireImage(); ImgList.Add(Image1); } if(ImgList.Count > 0) { ProcessEngine.NewImage(ImgList[0]); ImgList.RemoveAt(0); } }

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

Любой совет с благодарностью.

Ответы [ 4 ]

2 голосов
/ 30 марта 2010

Просто переинициализировать:

Заменить

Image1 = AcquireImage();

с

Image1 = new Image(AcquireImage());

или просто сказать

ImageList.Add(new Image(AcquireImage()));
1 голос
/ 30 марта 2010

Ваш код правильный. Ни один из приведенных выше кодов не влияет на ранее добавленные изображения. Линия:

Image1 = AcquireImage();

помещает ссылку (на изображение), возвращаемую из AcquireImage, в переменную ссылки Image1. Тогда:

ImgList.Add(Image1);

добавляет эту ссылку в ваш список. Изменение ссылочной переменной Image1 не влияет на ссылки, уже имеющиеся в списке.

0 голосов
/ 30 марта 2010

Если я правильно понимаю, что вы говорите, вы хотите иметь возможность повторно использовать переменную без перезаписи существующих данных. Хорошей новостью является то, что вам не нужно ничего менять. Вы частично правы, когда говорите, что Image1 - указатель: это ссылка на любое изображение, на которое он указывает в данный момент. Когда вы выделяете его:

Image1 = AcquireImage();

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

0 голосов
/ 30 марта 2010

Концептуально, ваш код будет в порядке. Важным элементом является то, что AcquireImage () выделяет новый экземпляр для каждого входящего изображения.

Если бы Image1 был указателем, у вас возникла бы проблема - однако ссылка C # не указатель.

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