我有一个带有两个Datalog类变量的表单
public partial class ModifyDataForm : Form
{
public DataLog DLog;
private DataLog copyCurrent;
public ModifyDataForm(DataLog log, int selectIndex = 0)
{
InitializeComponent();
DLog = (DataLog)log.Clone();
copyCurrent = (DataLog)log.Clone();
}
}
当我更新DLog的值时,copyCurrent的值也会改变,为什么?
我更新变量的函数在
之下 private void smooth_Click(object sender, EventArgs e)
{
int NValues; int POrder;
if (getSmoothParameters(out NValues, out POrder))//parameters are valid
{
float[] yvalues = DataLog.convertStringArrayToFloats(DLog.Data[labelIndex]);
float[] newyvalues = Filters.smooth.SavitzkyGolay(yvalues, NValues, POrder);
//I am updating the values of DLog here,
//but the values of copyCurrent also changes
DLog.Data[labelIndex] = Array.ConvertAll(newyvalues, x => AuxillaryFunctions.DecimalPlaceNoRounding((double)x));
((ViewDigiFiles)this.Owner).updateSelectedLog(DLog);
((ViewDigiFiles)this.Owner).glControl1.Invalidate();
}
else//parameters are NOT valid
{
MessageBox.Show("Invalid smoothing parameters.");
return;
}
}
答案 0 :(得分:6)
copyCurrent
的值不会改变。 copyCurrent
引用的对象中的数据可能会发生变化,但这是另一回事。
假设你给两个独立的人(爱丽丝和鲍勃)写了你的家庭住址。爱丽丝去把你的前门涂成红色。这改变了鲍勃的那张纸吗?不 - 但如果Bob在他的纸上查看地址,他仍然会看到一个红色的前门。
这是值类型和引用类型在C#中如何工作的基本部分。当变量属于引用类型时,它的值不是对象本身 - 它是一个引用,就像一个街道地址 - 它是一种导航到对象的方式。将一个变量的值复制到另一个变量只是复制参考,就像将街道地址从一张纸复制到另一张纸一样。
区分变量,引用和对象非常非常重要。有关更多详细信息,请参阅我的article on value types and reference types(或任何优秀的介绍性C#书)。