为什么我的第二个变量值在更新第一个时会发生变化?

时间:2014-07-29 17:27:42

标签: c# class access-levels

我有一个带有两个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;
        }
    }

1 个答案:

答案 0 :(得分:6)

copyCurrent的值不会改变。 copyCurrent 引用的对象中的数据可能会发生变化,但这是另一回事。

假设你给两个独立的人(爱丽丝和鲍勃)写了你的家庭住址。爱丽丝去把你的前门涂成红色。这改变了鲍勃的那张纸吗?不 - 但如果Bob在他的纸上查看地址,他仍然会看到一个红色的前门。

这是值类型和引用类型在C#中如何工作的基本部分。当变量属于引用类型时,它的值不是对象本身 - 它是一个引用,就像一个街道地址 - 它是一种导航到对象的方式。将一个变量的值复制到另一个变量只是复制参考,就像将街道地址从一张纸复制到另一张纸一样。

区分变量,引用和对象非常非常重要。有关更多详细信息,请参阅我的article on value types and reference types(或任何优秀的介绍性C#书)。