1

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

1 回答 1

6

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

假设你给两个不同的人(Alice 和 Bob)一张纸,上面写着你的家庭住址。爱丽丝去把你的前门漆成红色。这改变了鲍勃的纸条吗?不——但如果 Bob 访问他纸上的地址,他仍然会看到一个红色的前门。

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

区分变量、引用和对象非常重要。有关更多详细信息,请参阅我关于值类型和引用类型的文章(或任何好的 C# 入门书籍)。

于 2014-07-29T17:29:47.397 回答