我想知道这一点,因为我需要继承StringBuilder
来实现一个TextChanged
事件。我总是可以制作一个包含 aprivate StringBuilder
和隐式/显式转换的包装器,但这似乎不是一个合适的解决方案。
幸运的是,我可以从写入 StringBuilder 的对象继承,所以这对我来说不是问题,但我仍然很好奇为什么该类是密封的。
我想知道这一点,因为我需要继承StringBuilder
来实现一个TextChanged
事件。我总是可以制作一个包含 aprivate StringBuilder
和隐式/显式转换的包装器,但这似乎不是一个合适的解决方案。
幸运的是,我可以从写入 StringBuilder 的对象继承,所以这对我来说不是问题,但我仍然很好奇为什么该类是密封的。
这有点难以回答。赞成的答案有问题, StringBuilder 没有任何虚拟方法。因此,您无法做任何事情来破坏课堂或做任何“额外”不安全的事情。
我认为可能的原因是 CLR 对该类有特殊的了解。这对于 StringBuilder 来说有点普通,与它所熟悉的其他 .NET 类型相比,pinvoke marshaller 知道该类的外观。当您需要将字符串引用传递给非托管代码时使用它,允许它写入字符串内容。必要的,因为这对于 String 是不合法的,它是不可变的。pinvoke marshaller 知道如何在 pinvoke 调用后正确设置 StringBuilder 的内部成员。但不知道如何为您的派生类做到这一点。这种切片风险不完全值得不密封它的好处。特别是因为它没有虚拟方法,所以你根本无法覆盖它的行为。
否则,扩展方法是一种非常合理的解决方法。
StringBuilder
是密封的,因为它组装字符串,例如,永远不应该有从它继承的理由,因为任何使用都应该在范围内受到限制。StringBuilder
不是替代品,string
也不应该以这种方式使用。该类的目标是有一种方法可以轻松处理需要可变字符串的任何操作而不会降低性能。因此,没有办法继承自StringBuilder
将提供任何实用程序,并且会在类处理可变字符串时产生可能的安全问题。
看一下参考源,它不是一个简单的类,而是一个非常专注的实用程序。此外,它会做一些事情,unsafe
因此允许继承将允许修改可能危及安全性的不安全代码。