我想知道这一点,因为我需要继承StringBuilder
来实现TextChanged
事件。我总是可以创建一个包含private StringBuilder
和隐式/显式转换的包装器,但这似乎不是一个合适的解决方案。
幸运的是,我可以从写入StringBuilder的对象继承,所以这对我来说不是一个问题,但我仍然很好奇为什么这个类是密封的。
答案 0 :(得分:14)
这有点难以回答。 upvoted答案有问题,StringBuilder没有任何虚拟方法。所以你无法做什么来打破课程或做任何“额外”不安全的事情。
我认为可能的原因是CLR具有该类的特殊知识。这对于StringBuilder来说有点平凡,与其他.NET类型相比,pinvoke marshaller知道这个类是什么样的。当您需要将字符串引用传递给非托管代码时,可以使用它,允许它写入字符串内容。必要因为这对String不合法,所以它是不可变的。 pinvoke marshaller知道如何在pinvoke调用后正确设置StringBuilder的内部成员。但是不知道如何为你的派生类做到这一点。切割风险并不完全值得不密封它的好处。特别是因为它没有虚拟方法所以你根本无法覆盖它的行为。
扩展方法是一种非常合理的解决方法。
答案 1 :(得分:7)
StringBuilder
是密封的,因为它汇集了字符串,例如永远不应该有继承它的理由,因为任何使用都应该限制范围。 StringBuilder
不是string
的替代品,不应该以这种方式使用。该类的目标是有一种方法可以轻松处理任何需要可变字符串而无性能损失的操作。因此,继承StringBuilder
无法提供任何实用程序,并且在类处理可变字符串时会产生可能的安全问题。
看看reference source它不是一个简单的类,而是一个紧密集中的实用程序。此外,它执行unsafe
的操作,因此允许继承将允许修改可能危及安全性的不安全代码。