C# 传递类的副本就是改变原始副本

C# 传递类的副本就是改变原始副本,c#,class,C#,Class,我有一些代码将数据下载到一个类中进行存储,然后创建该类的一个副本,并将其传递到一个改变数据的方法中。不知何故,我原来的课程也被修改了,我不知道我做错了什么 Calculations calc = new Calculations(Symbol, Market); calc.stockData = loadData(Symbol, Market); for (int j = calc.stockData.Count - 8; j >= 0; j--)

我有一些代码将数据下载到一个类中进行存储,然后创建该类的一个副本,并将其传递到一个改变数据的方法中。不知何故,我原来的课程也被修改了,我不知道我做错了什么

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
                    }
Calculations calc=新计算(符号、市场);
calc.stockData=负荷数据(符号,市场);
对于(int j=calc.stockData.Count-8;j>=0;j--)
{
高价=0;
//0最新
//指数越高,它就越老
对于(int k=j+1;k高价格)
{
高价格=高风险当前高;
高指数=k;
}
}
测试=新测试();
test.returnPct=高价;
test.date=calc.stockData.ElementAtOrderFault(highIndex).date;
test.symbolClass=symbolList.ElementAtOrDefault(i);
计算副本=计算副本;
test.ratingClass=performCalculations(test.symbolClass,copy,test.date);//将副本传递到方法以进行更改
stuffList.Add(test);//在此处插入了断点,原始类(calc)已被更改
}
不是创建原始数据的副本,而是对相同数据的引用。 您需要克隆此数据

有关如何克隆的详细信息,请参见此处:


此代码不创建副本:

Calculations copy = calc;
对象中的p>都存在于堆中,并通过引用操作,与C++相比,在堆栈上创建对象,赋值等于复制操作。
相反,请实现IClonable并提供您自己的复制操作。

让我们浏览一下您的代码,以便您了解这里发生了什么。(您告诉代码要做的事情写在注释中。)


简单地说,在您的代码中,
calc
copy
指向内存中的同一对象。这就是为什么对
copy
的更改会影响
calc
。您需要做的是克隆您的对象,这样您就有了一个值相等但在内存中独立的新对象。

您以前读过关于对象引用的内容吗?Microsoft不再建议使用iClonable界面。请参阅文档的“”部分。“[ICLONABLE接口]未指定克隆操作是执行深度复制、浅层复制还是介于两者之间的任何操作。[…]因为克隆的调用方不能依赖于执行可预测克隆操作的方法,我们建议不要在公共API中实现ICLONABLE。”感谢您为我解释这一点!我将把这个标记为答案soon@user3610374不客气!您可能想阅读这篇文章,这篇文章有助于解释变量和引用/值类型在C#and中是如何工作的。感谢您提供了帮助我解决问题的链接
Calculations copy = calc;
// 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;