C# の文字列は、string キーワードを使用して宣言された文字配列です。リテラル文字列を宣言するときには、次の例に示すように引用符を使用します。
string s = "Hello, World!";
次のように部分文字列を抽出して文字列を連結できます。
string s1 = "orange";
string s2 = "red";
s1 += s2;
System.Console.WriteLine(s1); // outputs "orangered"
s1 = s1.Substring(2, 5);
System.Console.WriteLine(s1); // outputs "anger"
文字列オブジェクトは変更不可です。つまり、作成した文字列オブジェクトは変更できません。文字列を操作するメソッドは、実際には新しい文字列オブジェクトを返します。上記の例では、s1 と s2 の内容は連結され、1 つの文字列が形成されます。"orange" と "red" を含む 2 つの文字列は、どちらも変更されません。+= 演算子で、連結した内容を含む新しい文字列が作成されます。この結果、s1 から異なる文字列全体が参照されるようになりました。"orange" のみを含む文字列は存在しますが、s1 が連結されると参照されなくなります。
メモ : |
|---|
| 文字列の参照を作成するときは注意が必要です。文字列の参照を作成し、文字列を "変更" する場合、参照は文字列が変更されたときに作成された新しいオブジェクトではなく、元のオブジェクトを指したままになります。次にこの問題の例を示します。 |
string s1 = "Hello";
string s2 = s1;
s1 += " and goodbye.";
Console.WriteLine(s2); //outputs "Hello"
文字列に変更を加えると、新しい文字列オブジェクトが作成されます。パフォーマンスの低下を防ぐため、大規模な連結などの文字列操作は StringBuilder クラスを使用して行います。次に例を示します。
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.Append("one ");
sb.Append("two ");
sb.Append("three");
string str = sb.ToString();
StringBuilder クラスの詳細については、「StringBuilder の使用」を参照してください。
文字列操作
エスケープ文字
文字列には "\n" (改行) や "\t" (タブ) などのエスケープ文字を使用できます。次の行があるとします。
string hello = "Hello\nWorld!";
上の例と同じものを次に示します。
Hello
World!
円記号を使用する場合は、その前に円記号をもう 1 つ挿入してください。次の文字列があるとします。
string filePath = "\\\\My Documents\\";
上の例と実際には同じものを次に示します。
\\My Documents\
@ 記号
@ 記号は、文字列コンストラクタに対し、エスケープ文字と改行を無視するように指示します。したがって次の 2 つの文字列は同一です。
string p1 = "\\\\My Documents\\My Files\\";
string p2 = @"\\My Documents\My Files\";
ToString()
Object から派生するすべてのオブジェクトと同様に、文字列には、値を文字列に変換する ToString メソッドがあります。このメソッドでは、次のように数値を文字列に変換できます。
int year = 1999;
string msg = "Eve was born in " + year.ToString();
System.Console.WriteLine(msg); // outputs "Eve was born in 1999"
各文字へのアクセス
文字列のそれぞれの文字にアクセスするには、SubString()、Replace(),、Split() および Trim() などのメソッドを使用します。
string s3 = "Visual C# Express";
System.Console.WriteLine(s3.Substring(7, 2)); // outputs "C#"
System.Console.WriteLine(s3.Replace("C#", "Basic")); // outputs "Visual Basic Express"
また、次に示すように文字を文字配列にコピーすることもできます。
string s4 = "Hello, World";
char[] arr = s4.ToCharArray(0, s4.Length);
foreach (char c in arr)
{
System.Console.Write(c); // outputs "Hello, World"
}
文字列のそれぞれの文字にアクセスするには、インデックスを次のように使用します。
string s5 = "Printing backwards";
for (int i = 0; i < s5.Length; i++)
{
System.Console.Write(s5[s5.Length - i - 1]); // outputs "sdrawkcab gnitnirP"
}
大文字と小文字の変更
文字列の文字の大文字/小文字を変更するには、ToUpper() または ToLower() を次のように使用します。
string s6 = "Battle of Hastings, 1066";
System.Console.WriteLine(s6.ToUpper()); // outputs "BATTLE OF HASTINGS 1066"
System.Console.WriteLine(s6.ToLower()); // outputs "battle of hastings 1066"
比較
2 つの文字列を比較する最も簡単な方法は、== 記号と != 記号を使用する方法です。これらの記号は、大文字と小文字を区別して比較を実行します。
string color1 = "red";
string color2 = "green";
string color3 = "red";
if (color1 == color3)
{
System.Console.WriteLine("Equal");
}
if (color1 != color2)
{
System.Console.WriteLine("Not equal");
}
文字列オブジェクトの CompareTo() メソッドは、ある文字列が別の文字列より小さいか (<) または大きいか (>) に基づいて整数値を返します。文字列比較では Unicode 値が使用されます。また、小文字の値は対応する大文字の値よりも小さくなります。
string s7 = "ABC";
string s8 = "abc";
if (s7.CompareTo(s8) > 0)
{
System.Console.WriteLine("Greater-than");
}
else
{
System.Console.WriteLine("Less-than");
}
文字列の中にある文字列を検索するには、IndexOf() を使用します。IndexOf() は、検索文字列が見つからない場合は -1 を返し、見つかった場合は該当文字列の最初の位置を示す 0 から始まるインデックスを返します。
string s9 = "Battle of Hastings, 1066";
System.Console.WriteLine(s9.IndexOf("Hastings")); // outputs 10
System.Console.WriteLine(s9.IndexOf("1967")); // outputs -1
部分文字列への文字列の分割
文字列を部分文字列に分割する操作 (文を単語に分割する操作など) は、一般的なプログラミング タスクです。Split() メソッドは、区切り記号 (空白文字など) から成る char 配列を受け取り、部分文字列の配列を返します。この配列にアクセスするには、foreach を次のように使用します。
char[] delimit = new char[] { ' ' };
string s10 = "The cat sat on the mat.";
foreach (string substr in s10.Split(delimit))
{
System.Console.WriteLine(substr);
}
上記のコードにより、次に示すように 1 行に 1 つの単語が出力されます。
The
cat
sat
on
the
mat.
null 文字列と空の文字列
空の文字列は、文字数ゼロの System.String オブジェクトのインスタンスです。空の文字列は、空のテキスト フィールドを表すため、さまざまなプログラミング シナリオでよく使用されます。空の文字列は有効な System.String オブジェクトなので、メソッドを呼び出すことができます。空の文字列は、次のように初期化されます。
一方、null 文字列は System.String オブジェクトのインスタンスではないので、null 文字列でメソッドを呼び出そうとすると NullReferenceException が発生します。しかし、null 文字列を他の文字列に連結したり、他の文字列と比較することは可能です。次に、null 文字列の参照によって例外がスローされる場合とされない場合の例を示します。
string str = "hello";
string nullStr = null;
string emptyStr = "";
string tempStr = str + nullStr; // tempStr = "hello"
bool b = (emptyStr == nullStr);// b = false;
emptyStr + nullStr = ""; // creates a new empty string
int I = nullStr.Length; // throws NullReferenceException
StringBuilder の使用
StringBuilder クラスが作成する文字列バッファにより、プログラムで大量の文字列操作を実行する場合のパフォーマンスが向上します。StringBuilder 文字列を使用して、組み込み文字列データ型ではサポートされていない個別の文字を再割り当てできます。たとえば、このコードでは、新しい文字列を作成せずに、文字列の内容を変更します。
System.Text.StringBuilder sb = new System.Text.StringBuilder("Rat: the ideal pet");
sb[0] = 'C';
System.Console.WriteLine(sb.ToString());
System.Console.ReadLine();
この例では、StringBuilder オブジェクトを使用して、複数の数値型から 1 つの文字列を作成します。
class TestStringBuilder
{
static void Main()
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
// Create a string composed of numbers 0 - 9
for (int i = 0; i < 10; i++)
{
sb.Append(i.ToString());
}
System.Console.WriteLine(sb); // displays 0123456789
// Copy one character of the string (not possible with a System.String)
sb[0] = sb[9];
System.Console.WriteLine(sb); // displays 9123456789
}
}
参照項目
参照