2011-08-27 62 views
2

纵观.NET代码,Rectangle.Size返回new Size(Width, Height)。为什么微软选择这种模式?就我个人而言,我会认为Size将被存储在该结构中,并且例如Rectangle.Width将返回Size.Width。这将阻止每个属性调用创建新结构。我猜测有一些不变性质影响了这个决定,但我不确定是什么。为什么Rectangle.Size在每次调用时创建新的实例?

+0

问题是,现在每次调用Width或Height都会生成结构的副本。这个副本不能被抑制,许多具有Rectangle的类派生自MarshalByRefObject,这会阻止属性被内联。哪个属性最常用?很难说,但矩形方法本身从不使用大小。 –

+0

@Hans - 每次调用为什么会生成新副本?不能每个矩形都有自己的内部大小结构? – dlras2

+0

假设您有一个带有内部大小字段的矩形类型。现在想想如何实现宽度和高度属性获取器。 –

回答

4

Size是一个结构,所以它不像它在堆上创建一个新的对象。无论你做什么,它都会创建一个新的Size值。

说实话,我看不出这样做会有什么不同。考虑到和Height属性Size内联,我可以看到存储Size不会有太多的代价,正如您所建议的那样...但同样我可以看到Size的构造函数非常微不足道,以至于JIT可能以及能够将Rectangle.Size属性转换为几乎完全相同的本机代码。

所以我同意这是一个略微奇怪的决定,但我不认为这会伤害任何人。也许它使序列化更简单或类似的东西。

0

如果您总是得到实际大小的链接,则在更改它们时会产生副作用。如果你的意图是改变它们,你必须使用你想要操作的对象的属性或getter和setter。如果你想用它来做其他事情(计算布局等),这是最合适的解决方案。

相关问题