Почему меняются значения второй переменной при обновлении первой?

У меня есть форма с двумя переменными класса 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 ответ

Значение copyCurrent не меняется Данные внутри объекта, которые copyCurrent относится к может измениться, но это другое дело.

Предположим, вы даете двум отдельным людям (Алисе и Бобу) листы бумаги с указанием вашего домашнего адреса. Алиса идет и красит вашу входную дверь в красный цвет. Это изменило листок бумаги Боба? Нет - но если Боб посетит адрес на своем листке бумаги, он все равно увидит красную парадную дверь.

Это фундаментальная часть того, как типы значений и ссылочные типы работают в C#. Когда переменная имеет ссылочный тип, ее значение не сам объект - это ссылка, которая похожа на уличный адрес - это способ навигации к объекту. Копирование значения одной переменной в другую просто копирует ссылку, точно так же, как копирование адреса улицы с одного куска бумаги на другой.

Очень важно различать переменные, ссылки и объекты. См. Мою статью о типах значений и ссылочных типах (или любую хорошую вводную книгу по C#) для более подробной информации.

Другие вопросы по тегам