この記事ではC#の特殊な文字列型を中心に紹介します。非常に優れた参照値です。以下のエディターで見てみましょう
1. 前書き
文字列は参照型です。これは誰もが知っていますよね?しかし、使っていくうちに、値型の特徴がまだ残っていることがわかりました。これはなぜでしょうか。
その理由は、多数の文字列オブジェクトが操作され、多数の参照オブジェクトが操作される場合、パフォーマンスは値型ほど速くならないと .Net が考慮しているためです。このパフォーマンスを向上させるために、.Net は特別なソリューション、文字列常駐プールを提供します。
2. テキスト
まず、コードの一部を見てみましょう:
string str1 = "aa"; string str2 = "a" + "a"; Console.WriteLine(ReferenceEquals(str1, str2)); //print:true
str1 と str2 のメモリ ポインティング アドレスは、実際にはまったく同じです。その理由は、.Net が CLR (実際には上記の文字列常駐プール) 内にハッシュ テーブルを維持し、キーが文字列の内容であり、値が初期化で新しいヒープが作成されるときに指定されるマネージド ヒープのアドレスであるためです。文字列が入力されると、.Net はハッシュ テーブルを検索して同じ値があるかどうかを確認し、キーが同じであれば、既存の文字列のアドレス値が新しく作成された文字列に割り当てられます。 、アドレスが再割り当てされるため、上記のコードの記憶は true になります。
別のコードを見てみましょう:
string str3 = "ab"; string str4 = "a"; str4 += "b"; Console.WriteLine(ReferenceEquals(str3, str4));//print :false
false が表示される理由は、前の列のキーワード「初期作成」に注意してください。文字列が動的に作成されるとき、.Net は動的に作成しません。ハッシュ テーブルを検索して作成されているかどうかを確認しますが、直接作成することもできます
上記のコードを最適化し、より高い (xian) より高い (de) 追求 (dan) 要件 (teng) を実現したい場合は、次のようにすることができます。この文字列は比較のために文字列常駐プールに追加されます
3. 概要最後に、文字列についてのいくつかの結論:
1. clr の newobj 命令では文字列が作成されません。代わりに、ldstr コマンドを使用して作成してください。さらに、文字列は値型の特性を持っていますが、メモリ内の参照型であり、
2. 文字列はシールされているため、サブクラスによって統合することはできません。
3. 同じコンテンツを作成する場合、文字列は同じアドレスを指し、文字列に対する各操作は新しいアドレスを生成します (文字列の定常性)。スプライシングには動的である StringBuilder を使用します。定数である string とは異なりますが、StringBuilder の作成コストは比較的高いため、小規模なスプライシングには string を使用する方がパフォーマンスの点で優れている可能性があります。
上記は、C# の特殊な文字列型のコード例の詳細な説明です。さらに関連するコンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。