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

.net 为什么矩形.Size会在每次调用时创建新实例?,.net,design-patterns,immutability,.net,Design Patterns,Immutability,查看.NET代码,Rectangle.Size返回新的大小(宽度、高度)。微软为什么选择这种模式?我个人认为Size将存储在结构中,例如Rectangle.Width将返回Size.Width。这将防止每次属性调用都创建新结构。我猜有一些不变性的属性影响了这个决定,但我不确定是什么。Size是一个结构,所以它不像是在堆上创建一个新对象。无论您做什么,它都将创建一个大小值的新副本 老实说,无论哪种方式,我都看不出有多大区别。考虑到Size的Width和Height属性是内联的,我可以看出,按照您的

查看.NET代码,
Rectangle.Size
返回
新的大小(宽度、高度)
。微软为什么选择这种模式?我个人认为
Size
将存储在结构中,例如
Rectangle.Width
将返回
Size.Width
。这将防止每次属性调用都创建新结构。我猜有一些不变性的属性影响了这个决定,但我不确定是什么。

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

老实说,无论哪种方式,我都看不出有多大区别。考虑到
Size
Width
Height
属性是内联的,我可以看出,按照您的建议存储
Size
不会有太大的损失。。。但同样地,我可以看到
Size
的构造函数非常简单,JIT很可能能够将
Rectangle.Size
属性转换为几乎完全相同的本机代码


所以我同意这是一个有点奇怪的决定,但我认为这不会对任何人造成多大伤害。也许这会使序列化变得更简单或类似的东西。

如果您总是获得指向实际大小的链接,那么更改它们时会产生副作用。如果您打算更改它们,则必须使用要操作的对象的属性或getter和setter。如果您想将它们用于其他用途(计算布局等),这是最合适的解决方案

问题是,现在每个对宽度或高度的调用都会生成结构的副本。无法抑制此副本,许多具有矩形的类派生自MarshalByRefObject,这会阻止属性内联。最常用的属性是什么?很难说,但矩形方法本身从不使用大小。@Hans-为什么每次调用都会生成一个新副本?每个矩形不能有自己的内部大小结构吗?假设您有一个带有内部大小字段的矩形类型。现在考虑一下如何实现Width和Height属性getter。