Почему меняются значения второй переменной при обновлении первой?
У меня есть форма с двумя переменными класса 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#) для более подробной информации.