纵观.NET代码,Rectangle.Size
返回new Size(Width, Height)
。为什么微软选择这种模式?就我个人而言,我会认为Size
将被存储在该结构中,并且例如Rectangle.Width
将返回Size.Width
。这将阻止每个属性调用创建新结构。我猜测有一些不变性质影响了这个决定,但我不确定是什么。为什么Rectangle.Size在每次调用时创建新的实例?
2
A
回答
4
Size
是一个结构,所以它不像它在堆上创建一个新的对象。无论你做什么,它都会创建一个新的Size
值。
说实话,我看不出这样做会有什么不同。考虑到和Height
属性Size
内联,我可以看到存储Size
不会有太多的代价,正如您所建议的那样...但同样我可以看到Size
的构造函数非常微不足道,以至于JIT可能以及能够将Rectangle.Size
属性转换为几乎完全相同的本机代码。
所以我同意这是一个略微奇怪的决定,但我不认为这会伤害任何人。也许它使序列化更简单或类似的东西。
0
如果您总是得到实际大小的链接,则在更改它们时会产生副作用。如果你的意图是改变它们,你必须使用你想要操作的对象的属性或getter和setter。如果你想用它来做其他事情(计算布局等),这是最合适的解决方案。
相关问题
- 1. 为什么在创建新实例时创建DUP
- 2. startActivity每次创建Activity的新实例
- 3. Java是否在每次调用时都创建一个iterator()的新实例?
- 4. 在每次运行时都创建了BackgroundTasks的新实例吗?
- 5. 为什么每次创建新实体时,Shopify实体ID都会增加4?
- 6. 如何防止每次调用主机时创建类的新实例?
- 7. 为什么在Azure上创建新的VM实例时不显示D1V2实例?
- 8. 是否每次调用新的Handler(Looper.getMainLooper())创建它的新实例?
- 9. 在每次调用时带有新实例的名称空间
- 10. 为什么iOS GameCenter多人实时匹配每次创建新线程?
- 11. MediaBrowserServiceCompat实例每次运行时更改都会重新创建
- 12. 新配置().configure()。buildSessionFactory()在每次调用时创建新连接
- 13. 为什么Android Studio每次创建新项目时都不会创建content_main.xml?
- 14. 在每次迭代中创建Campaign的新实例
- 15. 为什么模拟器在每次都自动重新创建
- 16. 为什么在wsHttpBinding中每次都创建新会话ID
- 17. 如何在每次调用定时器时使用不同的实例变量创建新的UIImageView
- 18. getCurrentSession在每次调用时都创建新的连接
- 19. 为什么PHP在每次调用Foo :: getInstance()的脚本运行时都会创建一个单例的新实例?
- 20. 为什么有些类在创建实例时不需要“新建”一词?
- 21. 为什么在创建System.Net.Http.HttpClient()的实例时收到NullReferenceException?
- 22. 创建新实例的JLabel的每次点击
- 23. 什么时候创建Enum实例?
- 24. 为什么onChange()在重新创建片段时调用了两次
- 25. OpenCL在第一次函数调用时创建新线程,为什么?
- 26. 创建createjs对象的新实例每次都返回相同的实例
- 27. 创建每个实例的新文件
- 28. 为什么我在创建我的类的新实例时遇到java.lang.NullPointerException?
- 29. Sails.js在每次调用时创建新会话
- 30. 不想每次都创建一个新的实例吗?
问题是,现在每次调用Width或Height都会生成结构的副本。这个副本不能被抑制,许多具有Rectangle的类派生自MarshalByRefObject,这会阻止属性被内联。哪个属性最常用?很难说,但矩形方法本身从不使用大小。 –
@Hans - 每次调用为什么会生成新副本?不能每个矩形都有自己的内部大小结构? – dlras2
假设您有一个带有内部大小字段的矩形类型。现在想想如何实现宽度和高度属性获取器。 –