为什么此代码合法
Point point = new Point();
point.X = 6;
point.Y = 5;
但这会产生错误吗?
myButton.Location.X = 6;
myButton.Location.Y = 5;
我知道结构是值类型,我们得到副本,所以我们不能间接修改Location.X
,我们必须将myButton.Location
一个全新的结构分配给new Point(6,5)
,但为什么呢? point.X = 6
工作?
我没有区别。
答案 0 :(得分:1)
来自MSDN: How to: Position Controls on Windows Forms
使用
Location
属性设置控件的X和Y位置 同时。要单独设置位置,请使用控件的左侧 (X)或Top(Y)子属性。不要试图隐式设置X和Y. 表示按钮的Point结构的坐标 location,因为此结构包含按钮的副本 坐标强>
因为Point类是值类型,所以它是按值返回的, 意味着访问该属性会返回左上角的副本 控制。因此,调整Point的X或Y属性 从此属性返回不会影响Left,Right,Top或 控件的底部属性值。要调整这些属性设置 单独使用每个属性值,或使用a设置Location属性 新点。
答案 1 :(得分:1)
但为什么指向.X = 6有效?
因为point
是一个变量。您只是修改变量值的一部分。这是允许的和有用的(虽然我个人尽可能避免使用可变值类型。)
例如,你可以写:
Point point = myButton.Location;
point.X = 6;
myButton.Location = point;
...这实际上只会更改X
的{{1}}值。
更改复制然后丢失的值的部分不有用。
答案 2 :(得分:0)
因为当您说myButton.Location
Location
已经是副本时,您没有任何引用它。任何物体的改变和损失都没有意义。