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