当 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
我有一个 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