Ваша очередь представляет собой очередь ссылок на объекты, а не значения объекта. Либо клонировать объект и модифицировать клонированный объект, когда он не работает в очереди, либо не изменять объект после помещения его в очередь.
Рассмотрите аналогию для дальнейшего объяснения. Представьте, что вам нужно отслеживать 100 картин. Вы выбираете использовать очередь для отслеживания всех картин. У вас есть два варианта для хранения картин в очереди:
- Pickup каждый картину и переместить его в очередь
- магазина расположение каждой картины в очереди
вариант Ну-трудно потому что картины тяжелые действительно большие. Вариант 2 намного проще, потому что все, что вам нужно, - это простая ссылка на каждую картину. Однако, с вариантом 2, любой может изменить картину, не пройдя очередь, потому что картина фактически не находится в очереди. Вариант 1 называется pass by value. Вариант 2 называется pass by reference. И именно так C# хранит объекты в очереди.
Примечание: эта аналогия несовершенна, но она должна помочь вам понять, что происходит.
Следующий код должен помочь решить проблему:
object1 = 1;
queue.Enqueue(object1);
//Clone is a method you'll need to create on the class
//C# provides a MemberwiseClone method that should be very helpful
object2 = object1.Clone();
object2 = 2
MemberwiseClone
В качестве альтернативы, вы можете хранить информацию с типами значений (междунар, полукокса, BOOL, структура и т.д.), если вы храните простой и небольшой информации. Типы значений хранятся в очередях с опцией один (передать по значению)
int a = 1;
var myQueue = new Queue<int>();
myQueue.Enqueue(a);
a = 2;
//Prints 1
Console.WriteLine(myQueue.First());
//Prints 2
Console.WriteLine(a);
Что мне нужно сделать, чтобы получить свойство .Clone() на моем объекте? (пользовательский объект) включают ссылку? –
Плохая практика для внедрения IClonable. Этот вопрос объясняет, почему. http://stackoverflow.com/questions/3712449/what-is-the-use-of-iclonable-interface-in-net. –
@that_guy прочитал мой измененный ответ. [Object.MemberwiseClone] (http://msdn.microsoft.com/en-us/library/system.object.memberwiseclone.aspx) Метод возвращает также мелкую копию, вам нужна глубокая копия. –