改变结构价值

时间:2012-11-21 11:30:45

标签: c# types struct

为什么此代码合法

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工作?

我没有区别。

3 个答案:

答案 0 :(得分:1)

来自MSDN: How to: Position Controls on Windows Forms

  

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

Control.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已经是副本时,您没有任何引用它。任何物体的改变和损失都没有意义。