弦が封印されている理由

ドミトリー・カルペゾ

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など、および名前、コメントは、その性質上文字列です。データベースから文字列として取得するか、Webページのテキストボックスのどこかに文字列として入力するか、バーコードスキャナーなどで缶詰にします。

そして、多かれ少なかれ同じことをする複数のクラスを発明する代わりに、特定の機能を備えた文字列を持つことは本当に素晴らしく、より安全で、はるかにエレガントでしょう。

Dai

本質的に、特定のメソッドとプロパティを持つ文字列であるクラスはたくさんあります。それらは識別子、電子メール、名前などです。

この特定のユースケースは、継承ではなく構成によってより適切に処理されます。つまり、「電子メールアドレス文字列です」ではなく「電子メールアドレスは文字列表現あります」(電子メールアドレスは実際には複数の複合体であるため) SMTPを使用しているときに、たまたま簡潔な文字列表現を持つサブフィールド)。

もう1つのポイントは、文字列は基本的な型であることが意図されているということintです-から派生することは意味がありません-なぜ文字列なのですか?の実装Stringを拡張する場合(System.Stringたとえば、GetHashcode実装をオーバーライドする場合)にのみ派生する必要がありますが、オーバーライドする可能性のある操作の数は非常に限られているため、フレームワークのメンテナがサポートに煩わされる必要があるのはなぜですかそのシナリオ?

@Steveがコメントでリンクしているように、Eric Lippertによるこのブログ投稿ではsealed、特にメンテナンスPoVからの多くのクラスがなぜあるのかについても説明していますhttps://blogs.msdn.microsoft.com/ericlippert/2004/01/22/why-are -非常に多くのフレームワーククラス-封印された/

最後に、本当に独自の文字列動作が必要な場合(これは非常に可能です:長さ接頭辞付きの文字列、nullで終了する文字列、より大きな文字列バッファに定義された範囲として存在する文字列、リンクリストベースの文字列、Trie that複数の文字列をメモリ効率の高い方法で保持し、複数のアプローチのハイブリッドなど)独自の実装を最初から構築できますSystem.Stringこれらは、存在するために派生する必要はありません確かに、文字列値を期待するクラスにそれを渡すことはできませんが、おそらくそれらのコンシューマーはの特定の実装動作System.String(ランタイムパフォーマンス、不変性など)に依存しているため、これは公正です。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

戻り値の型が封印されている場合の射影チェック

分類Dev

Javaで封印されたクラスが実施されていますか?

分類Dev

で使用されている変数が削除される理由

分類Dev

ある弦には別の弦が魚の殻に含まれていますか?

分類Dev

「無効な制約:制約に使用されているタイプが封印されています」が無効です

分類Dev

UASPが使用されていない理由

分類Dev

UASPが使用されていない理由

分類Dev

封印された特性と封印された抽象クラスを基本クラスとして使用する場合の違い

分類Dev

Golang:runtime.GOMAXPROCSが256に制限されている理由

分類Dev

プログラムが押しつぶされている理由

分類Dev

SPAページが更新されている理由は?

分類Dev

この例でtmp_nameが使用されている理由

分類Dev

AlertDialogが何らかの理由で全画面表示されている

分類Dev

以前のhtmlでjavascriptが実行されている理由

分類Dev

登録されていなくてもIOptionsが解決される理由

分類Dev

LWJGLパッケージは封印されています

分類Dev

クラスが封印されている場合、タイプ...の式はパターンで処理できません

分類Dev

プロトタイプが封印されたときにオブジェクトをシムするためのハックを探しています

分類Dev

これが保存されて結果が返されない理由

分類Dev

遅いことが示されているのにreactnativeを使用する理由

分類Dev

SpanがBootstrapで壊れている理由

分類Dev

「列があいまいに定義されている」と表示される理由がわかりません

分類Dev

サブネットが更新されている理由がわかりません

分類Dev

webpackが「System.register」としてバンドルされている理由

分類Dev

封印されていないクラスの封印されていない仮想メソッド呼び出しの順序が重要なのはなぜですか?

分類Dev

封印されていないクラスの封印されていない仮想メソッド呼び出しの順序が重要なのはなぜですか?

分類Dev

Wix で KeyPath が設定されているとファイルが上書きされる理由

分類Dev

main()がJavaでpublicおよびstaticと宣言されている理由

分類Dev

(![] + [])[+ []] ...これが機能する理由を説明してください

Related 関連記事

  1. 1

    戻り値の型が封印されている場合の射影チェック

  2. 2

    Javaで封印されたクラスが実施されていますか?

  3. 3

    で使用されている変数が削除される理由

  4. 4

    ある弦には別の弦が魚の殻に含まれていますか?

  5. 5

    「無効な制約:制約に使用されているタイプが封印されています」が無効です

  6. 6

    UASPが使用されていない理由

  7. 7

    UASPが使用されていない理由

  8. 8

    封印された特性と封印された抽象クラスを基本クラスとして使用する場合の違い

  9. 9

    Golang:runtime.GOMAXPROCSが256に制限されている理由

  10. 10

    プログラムが押しつぶされている理由

  11. 11

    SPAページが更新されている理由は?

  12. 12

    この例でtmp_nameが使用されている理由

  13. 13

    AlertDialogが何らかの理由で全画面表示されている

  14. 14

    以前のhtmlでjavascriptが実行されている理由

  15. 15

    登録されていなくてもIOptionsが解決される理由

  16. 16

    LWJGLパッケージは封印されています

  17. 17

    クラスが封印されている場合、タイプ...の式はパターンで処理できません

  18. 18

    プロトタイプが封印されたときにオブジェクトをシムするためのハックを探しています

  19. 19

    これが保存されて結果が返されない理由

  20. 20

    遅いことが示されているのにreactnativeを使用する理由

  21. 21

    SpanがBootstrapで壊れている理由

  22. 22

    「列があいまいに定義されている」と表示される理由がわかりません

  23. 23

    サブネットが更新されている理由がわかりません

  24. 24

    webpackが「System.register」としてバンドルされている理由

  25. 25

    封印されていないクラスの封印されていない仮想メソッド呼び出しの順序が重要なのはなぜですか?

  26. 26

    封印されていないクラスの封印されていない仮想メソッド呼び出しの順序が重要なのはなぜですか?

  27. 27

    Wix で KeyPath が設定されているとファイルが上書きされる理由

  28. 28

    main()がJavaでpublicおよびstaticと宣言されている理由

  29. 29

    (![] + [])[+ []] ...これが機能する理由を説明してください

ホットタグ

アーカイブ