【问题标题】:Calling Rectangle.Inflate() when Rectangle is a property当 Rectangle 是一个属性时调用 Rectangle.Inflate()
【发布时间】:2015-02-13 11:45:06
【问题描述】:

我有一个具有Rectangle 属性的类,如下所示:

public class Test {
    public Rectangle Rect { set; get; }
}

在课堂之外,我试图将 Rect 的高度降低 20,但我收到了一个不允许的错误,因为它不是变量。

然后我用TestObj.Rect.Inflate(0,-20);,我没有报错但是运行程序时对Rect的高度没有影响。

出于与上述相同的原因,我可以理解,它应该不起作用,但为什么我没有收到任何错误?有没有通用的规则?

那么降低Rect的高度最好的方法是什么?

【问题讨论】:

  • 你能发布更多代码吗?
  • @DmitryBychenko Inflate 的返回类型是 void
  • 在您尝试的地方发布您的子Rect.Inflate(0,-20);

标签: c# winforms properties rectangles


【解决方案1】:

Rectangle是值类型,所以会按值复制。在 Rect 属性上调用 Inflate 时,您正在修改副本。不是实际的矩形。

如果 Rect 是一个字段而不是一个属性,它会起作用,因为访问字段不需要复制值。

我的意思是以下将起作用

public class Test
{
    public Rectangle Rect;
}

鉴于Rect 是一个属性,您需要重新分配计算值以使其工作。

参考Mutable value types are Evil

【讨论】:

    【解决方案2】:

    Inflate 的问题是它也会影响Y 坐标,假设您只想调整高度,那么您可以重新创建调整后高度的Rectangle

    new Rectangle(Test.Rect.Location, new Size(Test.Rect.Width, Test.Rect.Height - 20));
    

    【讨论】:

      【解决方案3】:

      矩形是一种值类型。 Inflate 方法返回 Rectangle 的新实例,但当前不正确。

      【讨论】:

        猜你喜欢
        • 2012-04-24
        • 1970-01-01
        • 2017-01-16
        • 2018-10-16
        • 2020-02-21
        • 2017-04-24
        • 2021-09-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多