Let*_*man 12 c# fonts immutability
不可变的字体会使程序员和GC都感到困扰,因为每次都需要创建一个新实例.
为什么Font是一个不可变的引用类型呢?
Ree*_*sey 29
它简化了渲染系统的使用.
如果框架允许Font是可变的,则需要检测更改,并重新定义如何定期渲染.由于Font创建了一个本机资源,因此保持这种不可变性可以防止系统担心必须在内部重复重新创建句柄.
此外,我不同意"程序员的痛苦".通过使Font不可变,可以更清楚地了解用户创建Font对象时发生的情况.如果需要新的Font,则需要创建一个新的Font对象,该对象又创建新的本机字体资源.使字体不可变使得更清楚的是发生了什么 - 你不太可能意外地创建性能问题.
如果字体是可变的,那么在更改字体属性时重复创建句柄就不那么明显了.
Eri*_*ert 14
好吧,问自己一些问题.
首先,字体在逻辑上是一个可变的东西,如购物清单,或不可变的东西,如数字?如果您正在为程序中的购物清单建模,那么将其变为可变是有意义的,因为您通常会想到有一个购物清单,其中的内容会在您用完或购买特定商品时发生变化.但是你通常建模的数字是不可变的 - 数字12是数字12,现在和永远.
我认为"Helvetica 12点大胆"是一个固定的,不可改变的东西,就像一个数字,而不是我可以改变的东西.
其次,字体在逻辑上更像是一个可以复制的值,或者它更像是一个你可以引用的东西?我不认为有两份Helvetica; 我想提到Helvetica.虽然数字我认为有不同的副本用于不同的目的 - 当我的购物清单上有12个项目和我的钥匙圈上有12个钥匙时,我不认为这两个东西都是"指12".
由于我认为字体是不可变的并且被引用,而不是像值一样可变和复制,我个人会将字体模型化为不可变引用类型.也许你对字体的直觉与我的不同.
它们不是结构,因为它们需要有终结器来包装底层对象并提供合理的IDisposable
实现.如果你Dispose()
自己的副本struct
怎么办?你每次克隆手柄吗?
对GC没有太大的压力......
它还允许Font
安全地重复使用,而不用担心它在操作中途改变;-p
归档时间: |
|
查看次数: |
1190 次 |
最近记录: |