为什么StringBuilder类是密封的
本文关键字:密封 StringBuilder 为什么 | 更新日期: 2023-09-27 18:25:57
我想知道这一点,因为我需要从StringBuilder
继承来实现TextChanged
事件。我总是可以制作一个包含private StringBuilder
和隐式/显式转换的包装器,但这似乎不是一个合适的解决方案。
幸运的是,我可以从正在写入StringBuilder的对象继承,所以这对我来说并不是一个真正的问题,但我仍然很好奇为什么这个类是密封的。
这有点难以回答。投票支持的答案有问题,StringBuilder没有任何虚拟方法。因此,你不能做任何事情来破坏课堂或做任何"额外"不安全的事情。
我认为可能的原因是CLR拥有该类的特殊知识。这对StringBuilder来说有点平凡,与它熟悉的其他.NET类型相比,pinvokemarshaller知道类的样子。当您需要将字符串引用传递给非托管代码,使其能够写入字符串内容时,可以使用它。这是必要的,因为这对String来说是不合法的,它是不可变的。pinvoke编组器知道如何在pinvoke调用后正确设置StringBuilder的内部成员。但不知道如何为派生类执行此操作。这种切片风险不值得不密封它。特别是因为它没有虚拟方法,所以你根本无法覆盖它的行为。
在其他方面,扩展方法是一个非常合理的解决方法。
StringBuilder
是密封的,因为它组装字符串,例如,永远不应该有从中继承的理由,因为任何使用都应该受到范围的限制。StringBuilder
不是string
的替代品,不应以这种方式使用。该类的目标是能够轻松处理任何需要可变字符串的操作,而不会对性能造成影响。因此,从StringBuilder
继承不可能提供任何实用程序,也不可能在类处理可变字符串时产生可能的安全问题。
看看引用源,它不是一个简单的类,而是一个重点突出的实用程序。此外,它做的事情是unsafe
,因此允许继承将允许修改可能危及安全的不安全代码。