文字列 (C# プログラミング ガイド)Strings (C# Programming Guide)

文字列は、値がテキストの String 型のオブジェクトです。A string is an object of type String whose value is text. 内部では、テキストは Char オブジェクトの順次読み取り専用コレクションとして格納されます。Internally, the text is stored as a sequential read-only collection of Char objects. C# の文字列の末尾には null 終端文字はありません。したがって、C# の文字列には任意の数の null 文字 ('\0') を埋め込むことができます。There is no null-terminating character at the end of a C# string; therefore a C# string can contain any number of embedded null characters ('\0'). 文字列の Length プロパティは、Unicode 文字の数ではなく、文字列に含まれている Char オブジェクトの数を表します。The Length property of a string represents the number of Char objects it contains, not the number of Unicode characters. 文字列内の個別の Unicode コード ポイントにアクセスするには、StringInfo オブジェクトを使用します。To access the individual Unicode code points in a string, use the StringInfo object.

文字列と System.Stringstring vs. System.String

C# では、string キーワードは String のエイリアスです。In C#, the string keyword is an alias for String. したがって、Stringstring は等価であり、どちらの名前付け規則を使用してもかまいません。Therefore, String and string are equivalent, and you can use whichever naming convention you prefer. String クラスは、文字列を安全に作成、操作、比較するためのさまざまなメソッドを提供します。The String class provides many methods for safely creating, manipulating, and comparing strings. また、C# 言語は、一般的な文字列操作を簡略化するためにいくつかの演算子をオーバーロードします。In addition, the C# language overloads some operators to simplify common string operations. キーワードの詳細については、「string」を参照してください。For more information about the keyword, see string. 型およびメソッドの詳細については、「String」を参照してください。For more information about the type and its methods, see String.

文字列の宣言と初期化Declaring and Initializing Strings

次の例に示すように、文字列はさまざまな方法で宣言および初期化できます。You can declare and initialize strings in various ways, as shown in the following example:

// Declare without initializing.
string message1;

// Initialize to null.
string message2 = null;

// Initialize as an empty string.
// Use the Empty constant instead of the literal "".
string message3 = System.String.Empty;

//Initialize with a regular string literal.
string oldPath = "c:\\Program Files\\Microsoft Visual Studio 8.0";

// Initialize with a verbatim string literal.
string newPath = @"c:\Program Files\Microsoft Visual Studio 9.0";

// Use System.String if you prefer.
System.String greeting = "Hello World!";

// In local variables (i.e. within a method body)
// you can use implicit typing.
var temp = "I'm still a strongly-typed System.String!";

// Use a const string to prevent 'message4' from
// being used to store another string value.
const string message4 = "You can't get rid of me!";

// Use the String constructor only when creating
// a string from a char*, char[], or sbyte*. See
// System.String documentation for details.
char[] letters = { 'A', 'B', 'C' };
string alphabet = new string(letters);

文字列を文字の配列で初期化する場合を除き、文字列オブジェクトの作成に new 演算子を使用しないでください。Note that you do not use the new operator to create a string object except when initializing the string with an array of chars.

文字列の長さが 0 の新しい String オブジェクトを作成するには、Empty 定数値で文字列を初期化します。Initialize a string with the Empty constant value to create a new String object whose string is of zero length. 長さ 0 の文字列のリテラル文字列表現は "" です。The string literal representation of a zero-length string is "". null の代わりに Empty 値を使用して文字列を初期化すると、NullReferenceException が発生する可能性を減らすことができます。By initializing strings with the Empty value instead of null, you can reduce the chances of a NullReferenceException occurring. 静的な IsNullOrEmpty(String) メソッドを使用すると、アクセスを試行する前に文字列の値を検証できます。Use the static IsNullOrEmpty(String) method to verify the value of a string before you try to access it.

文字列オブジェクトの不変性Immutability of String Objects

文字列オブジェクトは変更不可です。つまり、作成した文字列オブジェクトは変更できません。String objects are immutable: they cannot be changed after they have been created. 文字列を変更するように見える String メソッドと C# 演算子はすべて、実際には新しい文字列オブジェクトで結果を返します。All of the String methods and C# operators that appear to modify a string actually return the results in a new string object. 次の例では、s1s2 の内容を連結して 1 つの文字列を形成するときに、2 つの元の文字列は変更されません。In the following example, when the contents of s1 and s2 are concatenated to form a single string, the two original strings are unmodified. += 演算子で、連結した内容を含む新しい文字列が作成されます。The += operator creates a new string that contains the combined contents. 新しいオブジェクトは変数 s1 に代入され、s1 に代入された元のオブジェクトはガベージ コレクションに対して解放されます。これは、他の変数がこのオブジェクトへの参照を保持していないためです。That new object is assigned to the variable s1, and the original object that was assigned to s1 is released for garbage collection because no other variable holds a reference to it.

string s1 = "A string is more ";
string s2 = "than the sum of its chars.";

// Concatenate s1 and s2. This actually creates a new
// string object and stores it in s1, releasing the
// reference to the original object.
s1 += s2;

System.Console.WriteLine(s1);
// Output: A string is more than the sum of its chars.

文字列の "変更" では、実際には文字列が新しく作成されるため、文字列への参照を作成するときには注意が必要です。Because a string "modification" is actually a new string creation, you must use caution when you create references to strings. 文字列の参照を作成し、元の文字列を "変更" する場合、参照は文字列が変更されたときに作成された新しいオブジェクトではなく、元のオブジェクトを指したままになります。If you create a reference to a string, and then "modify" the original string, the reference will continue to point to the original object instead of the new object that was created when the string was modified. この動作を表すコードの例を次に示します。The following code illustrates this behavior:

string s1 = "Hello ";
string s2 = s1;
s1 += "World";

System.Console.WriteLine(s2);
//Output: Hello

元の文字列での検索操作や置換操作などの変更に基づく新しい文字列を作成する方法の詳細については、「方法: 文字列の内容を変更する」を参照してください。For more information about how to create new strings that are based on modifications such as search and replace operations on the original string, see How to: Modify String Contents.

標準リテラル文字列と逐語的リテラル文字列Regular and Verbatim String Literals

次の例に示すように、C# で提供されるエスケープ文字を埋め込む必要がある場合は、標準リテラル文字列を使用します。Use regular string literals when you must embed escape characters provided by C#, as shown in the following example:

string columns = "Column 1\tColumn 2\tColumn 3";
//Output: Column 1        Column 2        Column 3

string rows = "Row 1\r\nRow 2\r\nRow 3";
/* Output:
  Row 1
  Row 2
  Row 3
*/

string title = "\"The \u00C6olean Harp\", by Samuel Taylor Coleridge";
//Output: "The Æolean Harp", by Samuel Taylor Coleridge

文字列テキストに円記号が含まれる場合 (ファイル パスなど) は、使いやすさと読みやすさを考慮して、逐語的文字列を使用します。Use verbatim strings for convenience and better readability when the string text contains backslash characters, for example in file paths. 逐語的文字列は、文字列テキストの一部として改行文字を保持するため、複数行文字列の初期化に使用できます。Because verbatim strings preserve new line characters as part of the string text, they can be used to initialize multiline strings. 引用符を逐語的文字列に埋め込むには、二重引用符を使用します。Use double quotation marks to embed a quotation mark inside a verbatim string. 逐語的文字列の一般的な使用方法の例を次に示します。The following example shows some common uses for verbatim strings:

string filePath = @"C:\Users\scoleridge\Documents\";
//Output: C:\Users\scoleridge\Documents\

string text = @"My pensive SARA ! thy soft cheek reclined
    Thus on mine arm, most soothing sweet it is
    To sit beside our Cot,...";
/* Output:
My pensive SARA ! thy soft cheek reclined
   Thus on mine arm, most soothing sweet it is
   To sit beside our Cot,... 
*/

string quote = @"Her name was ""Sara.""";
//Output: Her name was "Sara."

文字列のエスケープ シーケンスString Escape Sequences

エスケープ シーケンスEscape sequence 文字名Character name Unicode エンコーディングUnicode encoding
\'\' 単一引用符Single quote 0x00270x0027
\"\" 二重引用符Double quote 0x00220x0022
\\ 円記号Backslash 0x005C0x005C
\0\0 NullNull 0x00000x0000
\a\a 警告Alert 0x00070x0007
\b\b バックスペースBackspace 0x00080x0008
\f\f フォーム フィードForm feed 0x000C0x000C
\n\n 改行New line 0x000A0x000A
\r\r キャリッジ リターンCarriage return 0x000D0x000D
\t\t 水平タブHorizontal tab 0x00090x0009
\v\v 垂直タブVertical tab 0x000B0x000B
\u\u Unicode エスケープ シーケンス (UTF-16)Unicode escape sequence (UTF-16) \uHHHH (範囲:0000 - FFFF; 例: \u00E7 = "ç")\uHHHH (range: 0000 - FFFF; example: \u00E7 = "ç")
\U\U Unicode エスケープ シーケンス (UTF-32)Unicode escape sequence (UTF-32) \U00HHHHHH (範囲:000000 - 10FFFF; 例: \U0001F47D = "👽")\U00HHHHHH (range: 000000 - 10FFFF; example: \U0001F47D = "👽")
\x\x 可変長である点を除き "\u" に類似した Unicode エスケープ シーケンスUnicode escape sequence similar to "\u" except with variable length \xH[H][H][H] (範囲:0 - FFFF; 例: \x00E7\x0E7、または \xE7 = "ç")\xH[H][H][H] (range: 0 - FFFF; example: \x00E7 or \x0E7 or \xE7 = "ç")

警告

\x のエスケープ シーケンスを使用していて、指定している 16 進数が 4 桁未満である場合に、エスケープ シーケンスの直後の文字が有効な 16 進数 (0-9、A-F、a-f) であると、それらはエスケープ シーケンスの一部として解釈されます。When using the \x escape sequence and specifying less than 4 hex digits, if the characters that immediately follow the escape sequence are valid hex digits (i.e. 0-9, A-F, and a-f), they will be interpreted as being part of the escape sequence. たとえば、\xA1 はコード ポイント U+00A1 の "¡" を生成します。For example, \xA1 produces "¡", which is code point U+00A1. ただし、次の文字が "A" または "a" である場合、エスケープ シーケンスは代わりに \xA1A であると解釈され、コード ポイント U+0A1A の "ਚ" を生成します。However, if the next character is "A" or "a", then the escape sequence will instead be interpreted as being \xA1A and produce "ਚ", which is code point U+0A1A. そのような場合、4 桁の 16 進数すべてを指定する (例: \x00A1) と、誤って解釈される可能性がすべて排除されます。In such cases, specifying all 4 hex digits (e.g. \x00A1 ) will prevent any possible misinterpretation.

注意

コンパイル時に、逐語的文字列はエスケープ シーケンスと同様に通常の文字列に変換されます。At compile time, verbatim strings are converted to ordinary strings with all the same escape sequences. したがって、逐語的文字列をデバッガーのウォッチ ウィンドウで表示すると、ソース コードの逐語的バージョンではなく、コンパイラが追加したエスケープ文字が表示されます。Therefore, if you view a verbatim string in the debugger watch window, you will see the escape characters that were added by the compiler, not the verbatim version from your source code. たとえば、逐語的文字列 @"C:\files.txt" は、ウォッチ ウィンドウでは "C:\\files.txt" と表示されます。For example, the verbatim string @"C:\files.txt" will appear in the watch window as "C:\\files.txt".

書式指定文字列Format Strings

書式指定文字列は、その内容が実行時に動的に決定される文字列です。A format string is a string whose contents are determined dynamically at runtime. 書式指定文字列を作成するには、文字列内の中かっこの内側に "挿入式" かプレースホルダーを埋め込みます。Format strings are created by embedding interpolated expressions or placeholders inside of braces within a string. 中かっこ ({...}) 内にあるものはすべて値に解決され、実行時に書式設定された文字列として出力されます。Everything inside the braces ({...}) will be resolved to a value and output as a formatted string at runtime. 書式指定文字列を作成するには、文字列補間と複合書式設定の 2 つの方法があります。There are two methods to create format strings: string interpolation and composite formatting.

文字列補間String Interpolation

C# 6.0 以降で使用できる "補間文字列" は、特殊文字 $ によって識別され、中かっこ内に挿入式を含みます。Available in C# 6.0 and later, interpolated strings are identified by the $ special character and include interpolated expressions in braces. 文字列補間を初めて使用する場合は、簡単な概要として「文字列補間 - C# の対話形式チュートリアル」をご覧ください。If you are new to string interpolation, see the String interpolation - C# interactive tutorial for a quick overview.

文字列補間を使ってコードの読みやすさと保守性を向上させます。Use string interpolation to improve the readability and maintainability of your code. 文字列補間がもたらす結果は String.Format メソッドと同じですが、使いやすさとインラインのわかりやすさが向上します。String interpolation achieves the same results as the String.Format method, but improves ease of use and inline clarity.

var jh = (firstName: "Jupiter", lastName: "Hammon", born: 1711, published: 1761);
Console.WriteLine($"{jh.firstName} {jh.lastName} was an African American poet born in {jh.born}.");
Console.WriteLine($"He was first published in {jh.published} at the age of {jh.published - jh.born}.");
Console.WriteLine($"He'd be over {Math.Round((2018d - jh.born) / 100d) * 100d} years old today.");

// Output:
// Jupiter Hammon was an African American poet born in 1711.
// He was first published in 1761 at the age of 50.
// He'd be over 300 years old today. 

複合書式指定Composite Formatting

String.Format では、中かっこ内のプレースホルダーを使って書式指定文字列を作成します。The String.Format utilizes placeholders in braces to create a format string. この例では、上で使用した文字列補間の方法と同様の出力が生じます。This example results in similar output to the string interpolation method used above.

var pw = (firstName: "Phillis", lastName: "Wheatley", born: 1753, published: 1773);
Console.WriteLine("{0} {1} was an African American poet born in {2}.", pw.firstName, pw.lastName, pw.born);
Console.WriteLine("She was first published in {0} at the age of {1}.", pw.published, pw.published - pw.born);
Console.WriteLine("She'd be over {0} years old today.", Math.Round((2018d - pw.born) / 100d) * 100d);

// Output:
// Phillis Wheatley was an African American poet born in 1753.
// She was first published in 1773 at the age of 20.
// She'd be over 300 years old today.

.NET 型の書式設定について詳しくは、「.NET での型の書式設定」をご覧ください。For more information on formatting .NET types see Formatting Types in .NET.

部分文字列Substrings

部分文字列は、1 つの文字列に含まれる一連の文字です。A substring is any sequence of characters that is contained in a string. 元の文字列の一部から新しい文字列を作成するには、Substring メソッドを使用します。Use the Substring method to create a new string from a part of the original string. IndexOf メソッドを使用して、1 つまたは複数の部分文字列を検索できます。You can search for one or more occurrences of a substring by using the IndexOf method. 指定されたすべての部分文字列を新しい文字列に置換するには、Replace メソッドを使用します。Use the Replace method to replace all occurrences of a specified substring with a new string. Substring メソッドと同様に、Replace は実際に新しい文字列を返し、元の文字列は変更しません。Like the Substring method, Replace actually returns a new string and does not modify the original string. 詳細については、「How to: search strings」(方法: 文字列を検索する) および「方法: 文字列の内容を変更する」を参照してください。For more information, see How to: search strings and How to: Modify String Contents.

string s3 = "Visual C# Express";
System.Console.WriteLine(s3.Substring(7, 2));
// Output: "C#"

System.Console.WriteLine(s3.Replace("C#", "Basic"));
// Output: "Visual Basic Express"

// Index values are zero-based
int index = s3.IndexOf("C");
// index = 7

各文字へのアクセスAccessing Individual Characters

次の例に示すように、配列表記とインデックス値を使用すると、それぞれの文字への読み取り専用アクセスが可能になります。You can use array notation with an index value to acquire read-only access to individual characters, as in the following example:

string s5 = "Printing backwards";

for (int i = 0; i < s5.Length; i++)
{
    System.Console.Write(s5[s5.Length - i - 1]);
}
// Output: "sdrawkcab gnitnirP"

String メソッドが、文字列内の個別の文字を変更する必要がある機能を提供していない場合は、StringBuilder オブジェクトを使用して個別の文字の "埋め込み先" を変更し、StringBuilder メソッドを使用することで、結果を格納する新しい文字列を作成できます。If the String methods do not provide the functionality that you must have to modify individual characters in a string, you can use a StringBuilder object to modify the individual chars "in-place", and then create a new string to store the results by using the StringBuilder methods. 次の例では、特定の方法で元の文字列を変更し、将来使用するためにその結果を保存する必要があるとします。In the following example, assume that you must modify the original string in a particular way and then store the results for future use:

string question = "hOW DOES mICROSOFT wORD DEAL WITH THE cAPS lOCK KEY?";
System.Text.StringBuilder sb = new System.Text.StringBuilder(question);

for (int j = 0; j < sb.Length; j++)
{
    if (System.Char.IsLower(sb[j]) == true)
        sb[j] = System.Char.ToUpper(sb[j]);
    else if (System.Char.IsUpper(sb[j]) == true)
        sb[j] = System.Char.ToLower(sb[j]);
}
// Store the new string.
string corrected = sb.ToString();
System.Console.WriteLine(corrected);
// Output: How does Microsoft Word deal with the Caps Lock key?            

null 文字列と空の文字列Null Strings and Empty Strings

空の文字列はゼロ文字を含む System.String オブジェクトのインスタンスです。An empty string is an instance of a System.String object that contains zero characters. 空の文字列は、空のテキスト フィールドを表すため、さまざまなプログラミング シナリオでよく使用されます。Empty strings are used often in various programming scenarios to represent a blank text field. 有効な System.String オブジェクトであるため、空の文字列でメソッドを呼び出すことができます。You can call methods on empty strings because they are valid System.String objects. 空の文字列は、次のように初期化されます。Empty strings are initialized as follows:

string s = String.Empty;  

これに対し、null 文字列は System.String オブジェクトのインスタンスを参照しないので、null 文字列でメソッドを呼び出そうとすると NullReferenceException が発生します。By contrast, a null string does not refer to an instance of a System.String object and any attempt to call a method on a null string causes a NullReferenceException. しかし、null 文字列を他の文字列に連結したり、他の文字列と比較することは可能です。However, you can use null strings in concatenation and comparison operations with other strings. 次に、null 文字列の参照によって例外がスローされる場合とされない場合の例を示します。The following examples illustrate some cases in which a reference to a null string does and does not cause an exception to be thrown:

static void Main()
{
    string str = "hello";
    string nullStr = null;
    string emptyStr = String.Empty;

    string tempStr = str + nullStr;
    // Output of the following line: hello
    Console.WriteLine(tempStr);

    bool b = (emptyStr == nullStr);
    // Output of the following line: False
    Console.WriteLine(b);

    // The following line creates a new empty string.
    string newStr = emptyStr + nullStr;

    // Null strings and empty strings behave differently. The following
    // two lines display 0.
    Console.WriteLine(emptyStr.Length);
    Console.WriteLine(newStr.Length);
    // The following line raises a NullReferenceException.
    //Console.WriteLine(nullStr.Length);

    // The null character can be displayed and counted, like other chars.
    string s1 = "\x0" + "abc";
    string s2 = "abc" + "\x0";
    // Output of the following line: * abc*
    Console.WriteLine("*" + s1 + "*");
    // Output of the following line: *abc *
    Console.WriteLine("*" + s2 + "*");
    // Output of the following line: 4
    Console.WriteLine(s2.Length);
}

文字列を迅速に作成するための StringBuilder の使用Using StringBuilder for Fast String Creation

.NET での文字列操作は高度に最適化されており、ほとんどの場合パフォーマンスに大きく影響することはありません。String operations in .NET are highly optimized and in most cases do not significantly impact performance. ただし、短いループが数百回または数千回実行されている場合など、シナリオによっては文字列操作がパフォーマンスに影響する可能性があります。However, in some scenarios such as tight loops that are executing many hundreds or thousands of times, string operations can affect performance. StringBuilder クラスが作成する文字列バッファーにより、プログラムで大量の文字列操作を実行する場合のパフォーマンスが向上します。The StringBuilder class creates a string buffer that offers better performance if your program performs many string manipulations. StringBuilder 文字列を使用すると、組み込み文字列データ型ではサポートされていない個別の文字を再割り当てできます。The StringBuilder string also enables you to reassign individual characters, something the built-in string data type does not support. たとえば、このコードでは、新しい文字列を作成せずに、文字列の内容を変更します。This code, for example, changes the content of a string without creating a new string:

System.Text.StringBuilder sb = new System.Text.StringBuilder("Rat: the ideal pet");
sb[0] = 'C';
System.Console.WriteLine(sb.ToString());
System.Console.ReadLine();

//Outputs Cat: the ideal pet

この例では、StringBuilder オブジェクトを使用して、複数の数値型から 1 つの文字列を作成します。In this example, a StringBuilder object is used to create a string from a set of numeric types:

using System;
using System.Text;

namespace CSRefStrings
{
    class TestStringBuilder
    {
        static void Main()
        {
            var sb = new StringBuilder();

            // Create a string composed of numbers 0 - 9
            for (int i = 0; i < 10; i++)
            {
                sb.Append(i.ToString());
            }
            Console.WriteLine(sb);  // displays 0123456789

            // Copy one character of the string (not possible with a System.String)
            sb[0] = sb[9];

            Console.WriteLine(sb);  // displays 9123456789
            Console.WriteLine();
        }
    }
}

文字列、拡張メソッド、LINQStrings, Extension Methods and LINQ

String 型は、IEnumerable<T> を実装するので、文字列には Enumerable クラスで定義した拡張メソッドを使用できます。Because the String type implements IEnumerable<T>, you can use the extension methods defined in the Enumerable class on strings. 見やすさを考慮して、これらのメソッドは String 型の IntelliSense からは除外されていますが、使用できます。To avoid visual clutter, these methods are excluded from IntelliSense for the String type, but they are available nevertheless. 文字列で LINQLINQ クエリ式を使用することもできます。You can also use LINQLINQ query expressions on strings. 詳細については、「LINQ と文字列」を参照してください。For more information, see LINQ and Strings.

トピックTopic 説明Description
方法: 文字列の内容を変更するHow to: Modify String Contents 文字列の変換および文字列の内容を変更する手法を示します。Illustrates techniques to transform strings and modify the contents of strings.
方法: 文字列を比較するHow to: Compare Strings 文字列の序数とカルチャ固有の比較を実行する方法を示します。Shows how to perform ordinal and culture specific comparisons of strings.
方法: 複数の文字列を連結するHow to: Concatenate Multiple Strings 複数の文字列を 1 つに結合するさまざまな方法を示します。Demonstrates various ways to join multiple strings into one.
方法: String.Split を使用して文字列を解析するHow to: Parse Strings Using String.Split String.Split メソッドを使用して文字列を解析するコード例を紹介します。Contains code examples that illustrate how to use the String.Split method to parse strings.
方法: 検索文字列How to: Search Strings 特定のテキストまたは文字列のパターンの検索を使用する方法について説明します。Explains how to use search for specific text or patterns in strings.
方法: 文字列が数値を表しているかどうかを確認するHow to: Determine Whether a String Represents a Numeric Value 文字列を安全に解析して、有効な数値があるかどうかを確認する方法を示します。Shows how to safely parse a string to see whether it has a valid numeric value.
文字列補間String interpolation 書式指定文字列に便利な構文を提供する文字列補間機能について説明します。Describes the string interpolation feature that provides a convenient syntax to format strings.
基本的な文字列操作Basic String Operations System.String メソッドおよび System.Text.StringBuilder メソッドを使用し文字列の基本操作を実行する、トピックへのリンクがあります。Provides links to topics that use System.String and System.Text.StringBuilder methods to perform basic string operations.
文字列の解析Parsing Strings .NET の基本データ型の文字列形式を対応する型のインスタンスに変換する方法について説明します。Describes how to convert string representations of .NET base types to instances of the corresponding types.
.NET での日付と時刻文字列の解析Parsing Date and Time Strings in .NET "01/24/2008" などの文字列を、System.DateTime オブジェクトに変換する方法を示します。Shows how to convert a string such as "01/24/2008" to a System.DateTime object.
文字列の比較Comparing Strings 文字列を比較する方法について説明し、C# および Visual Basic での例を示します。Includes information about how to compare strings and provides examples in C# and Visual Basic.
StringBuilder クラスの使用Using the StringBuilder Class StringBuilder クラスの動的な文字列オブジェクトを作成および変更する方法について説明します。Describes how to create and modify dynamic string objects by using the StringBuilder class.
LINQ と文字列LINQ and Strings LINQ クエリを使用してさまざまな文字列操作を実行する方法について説明します。Provides information about how to perform various string operations by using LINQ queries.
C# プログラミング ガイドC# Programming Guide C# のプログラミング要素について説明するトピックへのリンクを示します。Provides links to topics that explain programming constructs in C#.