【问题标题】:Changing value in structure改变结构中的价值
【发布时间】:2012-11-21 11:30:45
【问题描述】:

为什么这段代码合法

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有效?

我不明白其中的区别。

【问题讨论】:

  • 对不起,我没有看到相似之处,我也不明白你在问什么?

标签: c# types struct


【解决方案1】:

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

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

例如,你可以这样写:

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

...这将有效地将X 的值更改为myButton.Location

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

【讨论】:

    【解决方案2】:

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

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

    Control.Location:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2021-07-30
        • 2016-04-10
        • 1970-01-01
        • 2014-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-29
        相关资源
        最近更新 更多