Chr*_*ris 1 c# class access-levels
我有一个带有两个Datalog类变量的Form
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();
}
}
Run Code Online (Sandbox Code Playgroud)
当我更新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;
}
}
Run Code Online (Sandbox Code Playgroud)
价值copyCurrent不会改变.copyCurrent 引用的对象内的数据可能会发生变化,但这是另一回事.
假设你给两个单独的人(爱丽丝和鲍勃)纸上写着你的家庭住址.爱丽丝去把你的前门涂成红色.这改变了鲍勃的那张纸吗?不 - 但如果鲍勃在他的纸上查看地址,他仍然会看到一个红色的前门.
这是值类型和引用类型在C#中如何工作的基本部分.当变量属于引用类型时,它的值不是对象本身 - 它是一个引用,就像一个街道地址 - 它是一种导航到对象的方式.将一个变量的值复制到另一个变量只是复制参考,就像将街道地址从一张纸复制到另一张纸上一样.
这是非常变量,引用和对象之间的区别很重要.有关更多详细信息,请参阅我关于值类型和引用类型的文章(或任何优秀的C#入门书).
| 归档时间: |
|
| 查看次数: |
488 次 |
| 最近记录: |