为什么Font不可变?

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".

由于我认为字体是不可变的并且被引用,而不是像值一样可变和复制,我个人会将字体模型化为不可变引用类型.也许你对字体的直觉与我的不同.

  • @Eric - 我认为这是一个无法回答的哲学问题.如果我们采用"时间之外"的观点,那么可以说列表的所有版本都可以共存,按时间索引,而今天更改列表并不会改变昨天的列表.对我来说,相关的问题是"这个世界模型是否简化了手头问题的解决方案?",这取决于具体情况. (3认同)
  • @kvb:你在时间之外的理想形式的柏拉图式永恒世界中购买杂货吗?这肯定会解决枯萎的生菜问题. (3认同)
  • @Itay:当我的妻子要求我将牛奶添加到购物清单时,我不会销毁旧的清单并生成一个添加了牛奶的新清单.该列表是可变的,因此对具有可变类型的购物清单进行建模是有意义的.当然,建模列表作为不可变的上下文是有意义的. (2认同)
  • @Itay:我认为在设计课程时这些事情非常重要.我不要求你同意我的意见.如果这些比较对您没有帮助,请不要使用它们.您的文档编辑系统示例很好; 如果我正在编写这样一个系统,我可能会将文档建模为一个可变对象,因为这就是用户对文档的看法.但是,我也可能将其建模为不可变对象,因为这样我就可以更轻松地构建丰富的undo-redo系统.这是一个我会仔细考虑的工程决策; 双方都有很多利弊. (2认同)

Mar*_*ell 8

它们不是结构,因为它们需要有终结器来包装底层对象并提供合理的IDisposable实现.如果你Dispose()自己的副本struct怎么办?你每次克隆手柄吗?

对GC没有太大的压力......

它还允许Font安全地重复使用,而不用担心它在操作中途改变;-p