当 Rectangle 是 属性 时调用 Rectangle.Inflate()

Calling Rectangle.Inflate() when Rectangle is a property

我有一个 class 和 Rectangle 属性 如下:

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

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

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

我能理解和上面一样的原因,它不应该工作,但为什么我没有收到任何错误?有通用规则吗?

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

Inflate 的问题是它也会影响 Y 坐标,假设您纯粹只想调整高度,那么您只需重新创建 Rectangle 并调整身高

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

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

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

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

我的意思是以下会起作用

public class Test
{
    public Rectangle Rect;
}

鉴于 Rect 是 属性,您需要重新分配计算值以使其生效。

参考Mutable value types are Evil