为什么Rectangle.Size会在每次调用时创建新实例?

时间:2011-08-27 19:50:03

标签: .net design-patterns immutability

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

2 个答案:

答案 0 :(得分:4)

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

说实话,我无法看出它会产生很大的不同。鉴于Width的{​​{1}}和Height属性已内联,我可以看到,如您所建议的那样存储Size会有很多惩罚......但是同样地,我可以看到Size的构造函数是如此微不足道,以至于JIT很可能能够将Size属性转换为几乎完全相同的本机代码。

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

答案 1 :(得分:0)

如果您始终获得实际尺寸的链接,则在更改时会产生副作用。如果您打算更改它们,则必须使用要操作的对象的属性或getter和setter。如果你想将它们用于其他东西(计算布局等),这是最合适的解决方案。