为什么我在这份C#return中得到的是一份参考而不是一份副本?

为什么我在这份C#return中得到的是一份参考而不是一份副本?,c#,C#,我有这部分代码: MeasDataSet dset = new MeasDataSet(); MeasDataPoint point = new MeasDataPoint(); //... MeasDataSet dset2 = new MeasDataSet(dset._path); dset2.SaveResults(); point = dset2.GetDataPointAt(dset2.Size - 1); point.Current = 7566; dset2.SaveResul

我有这部分代码:

MeasDataSet dset = new MeasDataSet();
MeasDataPoint point = new MeasDataPoint();
//...
MeasDataSet dset2 = new MeasDataSet(dset._path);
dset2.SaveResults();

point = dset2.GetDataPointAt(dset2.Size - 1);
point.Current = 7566;
dset2.SaveResults();
其中MeasDapPoint和Set只是一些包含测量数据的类(指向单个点,并使用其他方法设置点集合)

调用SaveResults()时,它应该将数据集中的数据保存到一个文件中,但是使用上面的代码不会保存旧点,而是保存修改过的点(point.Current=7566;)。 所以现在基本上point改变了我数据集中的值,而不是我所期望的值的副本

GetDataPointAt(数据集方法):


有人知道它为什么会这样吗?

dset.\u path
MeasDataPoint
对象的整个集合?如果是这样,则构造函数
new MeasDataSet(dset.\u path)
似乎只是在内部存储对原始
dset
点集合的引用,这意味着它正在处理原始集合。看

您可以扩展或修改
MeasDataSet
构造函数,以在分配给dset2时通过深度复制在MeasDataPoint对象上迭代以创建新对象。这里有一个粗略的想法:

public MeasDataSet(List<MeasDataPoint> path) {
   var copiedPath = new List<MeasDataPoint>();
   foreach(var point in path) {
      copiedPath.Add(new MeasDataPoint() {
         Prop1 = point.Prop1,
         Prop2 = point.Prop2
      });
   }
   // do something with your newly created deep copy of copiedPath...
}
公共测量数据集(列表路径){
var copiedPath=新列表();
foreach(路径中的变量点){
copiedPath.Add(新的MeasDataPoint(){
Prop1=点。Prop1,
Prop2=点.Prop2
});
}
//对新创建的copiedPath深度副本执行某些操作。。。
}

C#中的所有
class
都是引用类型-因此,如果
return
对象,则返回的是对该对象的引用,而不是副本。创建副本必须明确完成。谢谢,在这里我再次注意到我对c#非常陌生。所以我想我应该写一个复制构造函数并用它来复制?或者是否有更好/更快的方法来装箱copy@Darki:除非项目中的许多类都需要这种复制行为,否则复制构造函数是解决此问题的最简单的一次性解决方案。谢谢,是的,这有点令人困惑,但是_path实际上是此特定测试的文件路径。它只对调试可见(通常是私有的)。它允许使用构造函数加载一组旧数据。因此,这两个集合之间应该没有任何联系,除了在发生更改时将被复制到不同位置的文件。
public MeasDataSet(List<MeasDataPoint> path) {
   var copiedPath = new List<MeasDataPoint>();
   foreach(var point in path) {
      copiedPath.Add(new MeasDataPoint() {
         Prop1 = point.Prop1,
         Prop2 = point.Prop2
      });
   }
   // do something with your newly created deep copy of copiedPath...
}