2016-01-03 2 views
0
//save the current origin value   
Employee temp = Origin; 
// do some staff with origin and it changes the origin value. 

//restore origin to the temp 
Origin = temp; 
//here i expected the origin value restore to the temp but it doesn't. 

изменение температуры с указанием источника. в другом слове и temp и origin имеют одинаковые значения !!!изменение временных переменных после инициирования

Я хочу сохранить Origin значение и восстановить его, но если origin изменяет также изменения temp. Его вроде компилятор не инициирует temp.

Я предполагаю, что это настоящее фундаментальное развивающее знание, но я не смог найти ответ. так жаль об этом.

UPDATE до сих пор я пытался их, но не из них работал:

var temp = Origin; 
object tmp = temp; 
Origin = (Employee)tmp; 

var temp = new Employee(); 
temp = Origin; 
Origin = temp; 

, наконец, как дорогой @erikscandola сказал я копирую все свойства по одному в к temp объекту и его работали. но это было очень сложно (предполагая, что Employee - настоящий большой объект). есть ли лучший способ сделать такое? это действительно кажется легким.

+3

Убедитесь, что вы понимаете разницу между [типами значений и типами ссылок] (https://msdn.microsoft.com/en-us/library/t63sy5hs.aspx), и вы поймете, что не так с вашим кодом. (Подсказка - кажется, вы используете ссылочные типы) – dotnetom

+0

Сообщение недостает [MCVE], поэтому на него нельзя ответить, но вы, вероятно, найдете объяснение в http://stackoverflow.com/questions/5057267/what-is-the- разница между ними-а-референс-типа-и-значение-типа-в-с. –

+0

@dotnetom большое вам спасибо. Я получаю это сейчас. его вид как темп, так и у Оргина одинаковая память. но как решить мою проблему? могу ли я создать временное значение со своей собственной памятью? – David

ответ

2

Это нормальное поведение C#. Когда вы назначаете объект другому объекту, вы назначаете один и тот же экземпляр. Таким образом, temp и Origin имеют одинаковый указатель. Для того, чтобы назначить Origin к temp вам нужно сделать это в конструкторе:

public Employee(Employee e){ 
    // copy all property values 
} 

Затем вызывается конструктор:

Employee temp = new Employee(Origin); 

Теперь вы можете делать то, что вы хотите с Origin без изменения значения temp.

+0

Спасибо. но его невозможно! у сотрудника столько свойств. а также я не имею доступа к классу. – David

+0

Вы можете создать метод для сопоставления всех свойств. Инициализируйте нового сотрудника Employee temp = new Employee(); 'затем вызовите метод для копирования всех' CopyEmployeed (temp, Origin); ' – erikscandola

0

Класс в .Net является ссылочным типом и при изменении их изменения. вы можете использовать Temp объекта, как это:

Employee temp = Origin; 

Object tmp = temp; 

и когда вы хотите использовать, вы должны бросить Befor использования. enter image description here

+0

Спасибо. вы имеете в виду, что я делаю что-то вроде этого: Object temp = Origin; затем Origin = Temp? – David

+0

есть. обновленный ответ.Его лучше объяснить. –

+0

Спасибо. но он не работает. Я пробовал это: var temp = Origin; объект tmp = temp; Origin = (Employee) tmp; – David

4

Оба temp и Origin являются ссылочными типами, temp и Origin указывают на то же место памяти в куче, и поэтому они имеют одинаковое значение. Чтобы избежать этого создавать новые Employee как:

var temp = new Employee(); 

Это позволит создать новую ячейку памяти в куче и, таким образом, имеет свое другое значение.

+0

Спасибо. но он не работает. Я пробовал это: var temp = new Employee(); temp = Origin; – David

+0

В таком случае вы можете использовать структуру копирования, в которой необходимо сопоставить все свойства emp со свойствами temp – SarveshwarPM

Смежные вопросы