1

为什么下面的代码是合法的

Point point = new Point();
point.X = 6;
point.Y = 5;

但这会产生错误?

myButton.Location.X = 6;
myButton.Location.Y = 5;

我知道结构是值类型,我们得到副本,所以我们不能Location.X间接修改,我们必须分配给myButton.Location一个全新的结构 as new Point(6,5),但为什么point.X = 6有效?

我不明白区别。

4

3 回答 3

1

来自MSDN:如何:Windows 窗体上的位置控件

使用该Location属性同时设置控件的 X 和 Y 位置。要单独设置位置,请使用控件的 Left (X) 或 Top (Y) 子属性。不要试图隐式设置表示按钮位置的 Point 结构的 X 和 Y 坐标,因为该结构包含按钮坐标的副本

控制。地点

因为 Point 类是值类型,所以它是按值返回的,这意味着访问该属性会返回控件左上角的副本。因此,调整从该属性返回的 Point 的 X 或 Y 属性不会影响控件的 Left、Right、Top 或 Bottom 属性值。要调整这些属性,请单独设置每个属性值,或使用新点设置 Location 属性。

于 2012-11-21T11:33:31.057 回答
1

但为什么 point.X = 6 有效?

因为point是变量。您只是在修改变量值的一部分。这是允许且有用的(尽管我个人会尽可能避免使用可变值类型)。

因此,例如,您可以编写:

Point point = myButton.Location;
point.X = 6;
myButton.Location = point;

...这将有效地改变 for 的XmyButton.Location

更改被复制然后丢失的值的一部分是没有用的。

于 2012-11-21T11:33:38.973 回答
0

因为当你说myButton.Location Location已经是副本时,你没有任何参考。任何物体的改变和失去它都没有意义。

于 2012-11-21T11:37:04.323 回答