c# – 为什么字符串是密封的

我很好奇为什么System.String是密封的?

我知道,我可以做任何我不需要继承的事情,但仍然 – 为什么?

有很多类本质上是具有特定方法和属性的字符串.这些是标识符,电子邮件,名称等.

面向对象的设计建议将功能封装在特定的类中.在这里,我们有一种奇怪的情况,即最流行的对象框架中最可用的基本类型是不可扩展的.

谢谢.

编辑.

关于不变性的评论.很容易在私有方法中隐藏所有与状态相关的东西,并允许子类具有对类数据的只读访问权限.

// Safe inheritable immutable string (pseudocode).
class String
{
   // Private state
   private byte[] state;
   private void EditState(byte[]) {}
   // Protected read-only access to state
   protected byte getReadOnlyData() {}
   // Available to child classes overridable methods.
   protected virtual getHashCode() {}
   protected virtual xxx() {}
}

事实上,实际应用程序中的大多数对象都是字符串.所有这些连续出版物,ASIN,IMEI等,以及名称,评论,都是其性质的字符串.我们将它们作为数据库中的字符串,或者在网页上的文本框中键入字符串,或者通过条形码扫描仪等进行封装.

拥有特定功能的字符串,而不是发明多个类,或多或少做同样的事情,这将是非常好,更安全,更优雅.

最佳答案

There are a lot of classes that, by nature, are strings having specific methods and properties. Those are identifiers, emails, names etc.

这个特定的用例可以通过组合而不是继承来更好地处理,即:“电子邮件地址具有字符串表示”而不是“电子邮件地址是字符串”(因为电子邮件地址实际上是多个组合)当你使用SMTP时恰好碰巧有一个简洁的字符串表示的子字段.

另一点是String是一个基本类型 – 从int派生是没有意义的 – 为什么是一个字符串?如果你想扩展System.String的实现,你只需要从String派生 – 例如,你想要覆盖它的GetHashcode实现 – 但是你可以想象覆盖的操作数量是非常有限的,那么为什么框架维护者呢?打扰支持这种情况?

正如@Steve在评论中所链接的那样,Eric Lippert撰写的这篇博文也解释了为什么许多课程被密封,尤其是维护PoV:https://blogs.msdn.microsoft.com/ericlippert/2004/01/22/why-are-so-many-of-the-framework-classes-sealed/

最后,如果你真的想要自己的字符串行为(这很可能:你可以使用长度为前缀的字符串,以空字符结尾的字符串,在更大的字符串缓冲区中存在为定义范围的字符串,基于链表的字符串,Trie以高效内存的方式保存多个字符串,多种方法的混合,依此类推)您可以从头开始构建自己的实现 – 这些都不需要从System.String派生而存在.当然,您无法将其传递给期望String值的类,但这是公平的,因为这些消费者可能依赖于System.String的特定实现行为(例如运行时性能,不变性等).

转载注明原文:c# – 为什么字符串是密封的 - 代码日志