为什么Rectangle.Size在每次调用时创建新的实例?
问题描述:
纵观.NET代码,Rectangle.Size
返回new Size(Width, Height)
。为什么微软选择这种模式?就我个人而言,我会认为Size
将被存储在该结构中,并且例如Rectangle.Width
将返回Size.Width
。这将阻止每个属性调用创建新结构。我猜测有一些不变性质影响了这个决定,但我不确定是什么。为什么Rectangle.Size在每次调用时创建新的实例?
答
Size
是一个结构,所以它不像它在堆上创建一个新的对象。无论你做什么,它都会创建一个新的Size
值。
说实话,我看不出这样做会有什么不同。考虑到和Height
属性Size
内联,我可以看到存储Size
不会有太多的代价,正如您所建议的那样...但同样我可以看到Size
的构造函数非常微不足道,以至于JIT可能以及能够将Rectangle.Size
属性转换为几乎完全相同的本机代码。
所以我同意这是一个略微奇怪的决定,但我不认为这会伤害任何人。也许它使序列化更简单或类似的东西。
答
如果您总是得到实际大小的链接,则在更改它们时会产生副作用。如果你的意图是改变它们,你必须使用你想要操作的对象的属性或getter和setter。如果你想用它来做其他事情(计算布局等),这是最合适的解决方案。
问题是,现在每次调用Width或Height都会生成结构的副本。这个副本不能被抑制,许多具有Rectangle的类派生自MarshalByRefObject,这会阻止属性被内联。哪个属性最常用?很难说,但矩形方法本身从不使用大小。 –
@Hans - 每次调用为什么会生成新副本?不能每个矩形都有自己的内部大小结构? – dlras2
假设您有一个带有内部大小字段的矩形类型。现在想想如何实现宽度和高度属性获取器。 –