2015-03-16 2 views
0

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

Calculations calc = new Calculations(Symbol, Market); 
calc.stockData = loadData(Symbol, Market); 
for (int j = calc.stockData.Count - 8; j >= 0; j--) 
        { 
         highPrice = 0; 

         // 0 newest 
         // as you go higher in the index, it is older 
         for (int k = j + 1; k < j + 8; k++) 
         { 
          kIndex = k; 
          jIndex = j; 
          decimal highRiskCurrentHigh = Calculations.calculateReturnPercentageStatic(calc.stockData.ElementAtOrDefault(k).Close, 
           calc.stockData.ElementAtOrDefault(j).High); 

          if (highRiskCurrentHigh > highPrice) 
          { 
           highPrice = highRiskCurrentHigh; 
           highIndex = k; 
          } 
         } 

         Test test = new Test(); 
         test.returnPct = highPrice; 
         test.date = calc.stockData.ElementAtOrDefault(highIndex).Date; 
         test.symbolClass = symbolsList.ElementAtOrDefault(i); 
         Calculations copy = calc; 
         test.ratingClass = performCalculations(test.symbolClass, copy, test.date); // passing a copy into the method for altering 
         stuffList.Add(test); // inserted a breakpoint here and the original class (calc) has been altered 
        } 
+2

Вы уже читали о ссылках на объекты? – JonH

ответ

3

Давайте рассмотрим ваш код, чтобы вы поняли, что здесь происходит. (То, что вы рассказываете свой код, чтобы сделать написано в комментариях.)

// 1. create a new instance of the object 'Calculations' on the heap 
// 2. return the memory address of that instance and assign it to variable 'calc' 
Calculations calc = new Calculations(Symbol, Market); 

// 3. Create a variable called 'copy' that points to 'Calculations' type objects 
// 4. Assign the value of 'calc' (which is a reference to the heap object) to 'copy' 
Calculations copy = calc; 

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

+0

Спасибо, что объяснили это для меня! Я помечаю это как ответ в ближайшее время – user3610374

+1

@ user3610374 Добро пожаловать! Вы можете прочитать эту статью, которая полезна для объяснения того, как переменные и типы ссылок/значений работают на C# http://www.yoda.arachsys.com/csharp/parameters.html и http: //www.yoda.arachsys. ком/CSharp/memory.html. –

3
Calculations copy = calc; 

не создает копию исходных данных это ссылка на одни и те же данные. Вам нужно клонировать эти данные.

Более подробную информацию о том, как клонировать можно найти здесь:

Deep cloning objects

+0

Спасибо за отличную ссылку, которая помогла мне исправить мою проблему. – user3610374

5

Этот код не создает копию:

Calculations copy = calc; 

В C# все объекты существуют в куче и манипулируют через ссылки, сравните с C++, где вы можете создавать объекты в стеке, а присвоение равно операции копирования.

Вместо этого осуществите IClonable и предоставите собственную копию.

+2

Microsoft больше не рекомендует использовать интерфейс ICloneable. См. Раздел «Примечания к имплантерам» (https://msdn.microsoft.com/en-us/library/system.icloneable (v = vs.110) .aspx) »в документации. * «[Интерфейс ICloneable] не указывает, выполняет ли операция клонирования глубокую копию, мелкую копию или что-то среднее между ними. [...] Поскольку вызывающие абоненты Clone не могут зависеть от метода, выполняющего предсказуемую операцию клонирования, мы рекомендуем что ICloneable не будет реализован в публичных API-интерфейсах. "* –

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