文字列は、テキストを表現するために使用される Unicode 文字のシーケンシャル コレクションです。String オブジェクトは、文字列を表す System..::.Char オブジェクトのシーケンシャル コレクションです。String オブジェクトの値はシーケンシャル コレクションの内容であり、この値は変更できません。
String オブジェクトは、作成時点以降に値を変更できないことから、不変 (読み取り専用) と呼ばれます。String オブジェクトを変更するように見えるメソッドは、実際には変更内容が反映された新しい String オブジェクトを返します。文字列として使用されるオブジェクトの実際の内容を変更する必要がある場合には、System.Text..::.StringBuilder クラスを使用してください。
文字列内の各 Unicode 文字は、Unicode のスカラ値によって定義されます。これは Unicode のコード ポイントまたは Unicode 文字の序数値とも呼ばれます。各コード ポイントは UTF-16 エンコーディングを使用してエンコードされ、エンコーディングの各要素の数値は Char オブジェクトで表されます。
単一の Char オブジェクトは通常、単一のコード ポイントを表します。つまり、Char の数値はコード ポイントと等しくなります。しかし、1 つのコード ポイントに対して、複数のエンコード要素が必要になることがあります。たとえば、Unicode の補助コード ポイント (サロゲート ペア) は、2 つの Char オブジェクトを使用してエンコードされます。
インデックス
インデックスとは、String 内での Unicode 文字の位置ではなく、Char オブジェクトの位置を示すものです。インデックスは、0 を基準とし、文字列の先頭位置から始まる 0 以上の番号です。文字列の先頭がインデックス位置 0 になります。Unicode 文字は複数の Char オブジェクトとしてエンコードされる場合があるため、連続したインデックス値が連続した Unicode 文字に対応するとは限りません。各 Char オブジェクトではなく各 Unicode 文字を対象に処理を行うには、System.Globalization..::.StringInfo クラスを使用します。
序数的な操作とカルチャに依存した操作
String クラスのメンバは、String オブジェクトに対して言語的または序数的な操作を実行します。序数的な操作は、各 Char オブジェクトの数値に基づいて動作します。言語的な操作は、カルチャ固有の大文字と小文字、並べ替え、書式、解析などの規則を考慮して、String の値に基づいて動作します。言語的な操作は、カルチャが明確に宣言された場合はそのカルチャ、特に指定されなかった場合は現在のカルチャのコンテキストで実行されます。現在のカルチャの詳細については、「CultureInfo..::.CurrentCulture」を参照してください。
大文字と小文字の規則は、小文字から大文字への変換など、Unicode 文字の文字種を変換する方法を決定します。
書式指定規則は、値を文字列形式に変換する方法を決定します。一方、解析規則は、文字列形式で表されたものを値に変換する方法を決定します。
並べ替え規則は、Unicode 文字をアルファベット順に並べる方法と、2 つの文字列を相互に比較する方法を決定します。たとえば、Compare メソッドは言語に基づく比較を行うのに対して、CompareOrdinal メソッドは序数に基づく比較を行います。この結果として、現在のカルチャが英語 (U.S.) の場合、Compare メソッドでは 'a' が 'A' より小さいと見なされますが、CompareOrdinal メソッドでは、'a' は 'A' より大きいと見なされます。
.NET Framework では、単語、文字列、および序数での並べ替え規則がサポートされています。単語での並べ替えでは、英数字以外の特定の Unicode 文字には特別な重みが割り当てられる、カルチャに依存した文字列の比較が行われます。たとえば、ハイフン ("-") に割り当てられる重みは非常に小さいため、並べ替えられたリスト内の "coop" と "co-op" の出現位置は隣接します。文字列での並べ替えは、単語での並べ替えに似ていますが、例外的な処理が行われず、英数字以外のすべての記号が、すべての英数字の Unicode 文字よりも先になる点が違います。
カルチャに依存した比較とは、CultureInfo..::.InvariantCulture プロパティによって指定されるインバリアント カルチャを含む、CultureInfo オブジェクトを明示的または暗黙的に使用する比較です。現在の暗黙のカルチャは、Thread..::.CurrentCulture プロパティによって指定されます。
序数での並べ替えは、文字列内の各 Char オブジェクトの数値に基づいて文字列を比較します。序数に基づく比較では、1 つの文字の大文字形式と小文字形式でコード ポイントが異なるため、自動的に大文字と小文字が区別されます。ただし、大文字と小文字の区別が重要でないアプリケーションの場合は、大文字と小文字を区別しないで序数に基づく比較を行うように指定できます。これは、インバリアント カルチャを使用して文字列を大文字に変換し、その結果に対して序数に基づく比較を実行することと同じです。
単語、文字列、序数での並べ替え規則の詳細については、「System.Globalization..::.CompareOptions」を参照してください。
一般に、並べ替えには序数に基づく比較ではなく、カルチャに依存した比較が適しています。また、2 つの文字列が等価であるかどうかを判断する場合 (つまり ID の判別) には、カルチャに依存した比較ではなく、序数に基づく比較が適しています。
比較メソッドおよび検索メソッドの解説では、そのメソッドが大文字と小文字を区別するかどうか、およびカルチャに依存するかどうかを示します。定義上は、空文字列 ("") を含むすべての文字列は null 参照よりも大きいと評価され、また 2 つの null 参照は互いに等しいと評価されます。
正規化
一部の Unicode 文字には、組み合わせ文字や複合文字から成る、複数の等価なバイナリ表現が存在します。Unicode Standard では、同等のバイナリ表現が与えられたときに、結果的に同じ文字になるのであれば常に単一のバイナリ表現を返す、正規化と呼ばれるプロセスを定義しています。正規化は、それぞれ異なる規則に基づく複数のアルゴリズム (正規化形式) で実行されます。.NET Framework では、現在、C、D、KC、および KD 形式の正規化をサポートしています。通常、正規化された文字列のペアは、序数比較によって評価されます。
セキュリティについての考慮事項
アプリケーションにおいて、シンボル識別子 (ファイル名や名前付きパイプなど) や永続化されたデータ (XML ファイルのテキスト ベースのデータなど) に関するセキュリティ上の判断を行う場合は、カルチャに依存した比較ではなく序数に基づく比較を使用する必要があります。序数に基づく比較では、比較する文字のバイナリ値に応じて結果が異なるだけですが、カルチャに依存した比較では、有効なカルチャによって結果が異なる可能性があるからです。
機能
String クラスは、特定の機能 (String オブジェクトを比較する、String オブジェクトに含まれる文字または文字列のインデックスを返す、String オブジェクトの値をコピーする、文字列を分割または結合する、文字列の値を変更する、数値や日時、列挙値に書式を設定して文字列に変換する、文字列を正規化するなど) に特化した、さまざまなメンバを実装しています。
文字列と埋め込み null
.NET Framework では、String オブジェクトに埋め込み null を含めることができます。この場合、埋め込み null は文字列の長さに含まれます。ただし、言語 (C や C++ など) によっては、null 文字は文字列の末尾を表し、文字列の一部とは見なされず、文字列長に含まれないものもあります。これは、String オブジェクトに対しては、C プログラマおよび C++ プログラマ、または、C で書かれたライブラリまたは C++ で書かれたライブラリにおける、文字列に関する以下の一般的な前提が必ずしも当てはまらないことを意味します。
String オブジェクトをインスタンス化するネイティブの C コードおよび C++ コード、および、プラットフォーム呼び出しで String オブジェクトを渡されるコードで、埋め込み null が文字列の末尾を示すという前提を避ける必要があります。
実装されているインターフェイス