我有一个问题,当我尝试重新定位一个名为 的面板时pPan
,我有两种不同的方法来做到这一点:
在我写的按钮的点击事件中
pPan.Location = new Point (
pPan.Location.X +10 , pPan.Location.Y );
或者我可以写:
pPan.Location.X += 10;
那么这里有什么区别呢?我为什么要创建这个new Point
?
如果Point
是struct
,则必须使用第一个,因为当您调用该属性时,它会返回 的副本Location
,并且您尝试修改该副本。
Location 属性的类型是 Point,它是一个结构。你可能会收到类似的错误
无法修改“System.Windows.Forms.Control.Location”的返回值,因为它不是变量
当你设置它的 X、Y 值时。
但您可以分配新的 Point 对象:
pPan.Location = new Point (
pPan.Location.X +10 , pPan.Location.Y );
因为 Point 类是一个值类型(Visual Basic 中的结构,Visual C# 中的结构),所以它是按值返回的,这意味着访问该属性会返回控件左上角点的副本。因此,调整从该属性返回的 Point 的 X 或 Y 属性不会影响控件的 Left、Right、Top 或 Bottom 属性值。要调整这些属性,请单独设置每个属性值,或使用新点设置 Location 属性。如果 Control 是 Form,则 Location 属性值表示 Form 在屏幕坐标中的左上角。
相关 SO 问题:C# 以编程方式更改对象的位置
不同之处在于,在第一种方式中,您为 Point 对象分配新内存。第二种方式你只是改变现有对象的属性。
尽可能多地操作现有对象是一种很好的做法。所以我建议你使用第二种方式来改变位置。