字体是一成不变的苦痛都程序员和GC,因为你需要每次创建新实例。
为什么[字体不可变的引用类型呢?
字体是一成不变的苦痛都程序员和GC,因为你需要每次创建新实例。
为什么[字体不可变的引用类型呢?
它简化了从渲染系统的使用。
如果框架是允许字体是可变的,这将需要检测的变化,返工的渲染是如何发生的定期。 由于字体创建的本地资源,保持这个不可改变防止系统担心不必重复基础上重建内部手柄。
另外,我不同意在“困扰程序员”的条款。 通过使字体不可变的,这使得它更加明显当用户创建一个字体对象发生了什么。 如果你想要一个新的字体,你需要创建一个新的字体对象,这反过来又创造了新的本地字体资源。 使字体不变使得它更清楚发生了什么 - 你就不太可能意外地创建一个性能问题。
是字体可变的,这将是你多次创造把手为你改变字体的属性不太明显。
好吧,问自己一些问题。
首先,是一个逻辑上的字体一个可变的东西,就像一个购物清单,或不可改变的事情,就像一个数? 如果你在程序中模拟一个购物清单,这是有道理的,使其可变的,因为你通常认为具有的改变,因为你用完或购买特定项目的内容之一杂货清单。 但是号码,你通常建模为不可变的 - 数字12是12号,现在和永远。
我认为,“黑体12点大胆”的作为是固定的,一成不变的东西,就像一个数字,不是我可以改变。
其次,是一个逻辑上的字体更像一个值,你可以做的副本,或者是它更像是你可以参考一个单一的东西? 我不认为有黑体的“一分式两份”的; 我想指的是Helvetica字体。 而数字我认为是具有不同用途在不同的副本 - 当我有我的购物清单上的12个项目,并在我的钥匙圈12个按键,我不认为这两点为“指的是12”。
因为我觉得字体为不可变的简称,而不是可变的和值复制,我个人建模字体作为不可改变的引用类型。 也许你关于字体的直觉比我的不同。
他们不是因为结构他们需要有终结包的基础对象,并提供一个合理IDisposable
实现。 如果你会发生什么Dispose()
自己一个副本struct
? 你克隆每次处理?
这是不是真的在GC太多的压力......
它还允许Font
要安全地重新使用,无需担心它通过一个操作;-p改变了一半
我不同意这个苦痛的程序员。 有很多不变类型的BCL这是由程序员每天都在使用,并且不会造成任何问题。 System.String例如。
其中的保持不变的好处是,你不必每次都创建一个新的实例。 你可以因为它不会改变经常你想再次使用相同的字体类型。 在另一方面,如果它是可变的,则需要每次都将有助于保证使复印件,没有人从你下改变它。
最后,字体实际上不是这个词的严格意义上的不可变类。 它实现了IDisposable和Dispose方法眼泪就下来了基础本机对象。
你可以说,它的祸患开发商。 但你也可以做相反的情况下,同样的论点。
例如:
// Let me just set the button to the same font as the textbox...
button.Font = textBox.Font;
// ...except that I want the button's font to be bold.
button.Font.Bold = true;
如果上面的代码将设置一个按钮和一个文本框的字体加粗,同时Font
是可变的,违背了开发商的预期。
字体是一个设计不当的对象,这违反了单一职责原则和困难,你从这个举干。 与字体的问题是,它包括两件事情:(1)的字体应如何绘制的描述,以及(2)一个GDI字体对象与这些属性的字体。 前一种类型可能是没有后果可变,同时使后一类型的可变会对各种各样的问题。
别的不说,考虑一个如何跟踪典型的控制(如按钮)字体财产的所有权问题? 如果一个人有时会改变与控制关联的字体,应该一个为每个控制一个单独的字体对象,并对其进行处理改变控制的字体设置为别的东西的时候,还是要一个把所有的不同的字体一个列表正在使用如此以避免造成相同字体对象,或者什么过多数量?
如果存在着一个FontDescription结构(这是可变的,而不是IDisposable接口)之类的东西Control.Font是类型的FontDescription的(或更好,但暴露的控制型的FontDescription的参数setfont程序法),上述问题可以很简单地回答。 正因为如此,对于设置控制的字体最有效的方法是创建一个新的字体对象(如果还没有一个合适的),立即处置,然后做作业。 该字体的“字体描述”部分甚至出售事项后仍准有效,这是所有真正需要的Control.Font财产。