2−19 C#の文字列操作

stringは、C#のネイティブなデータタイプです。ただし、すべての基本タイプと同様に、stringは、実際には.NETライブラリのタイプの別名です。この場合はSystem.Stringです。System.Stringは、このようなユーテイリティに皆さんが期待するような数多くのメンバを提供します。長さを返すメソッド、サブストリングを見つけるメソッド、大文字/小文字の変換を行うメソッドなどです。表2-11に、興味深いメンバをいくつか(ただし、すべてではありません)示しておきます。

表2−11 System.Stringの主なメンバ
Stringクラスのメンバ説 明
Length このプロパティは、現在の文字列の長さを返す
concat() このstringクラスの静的メソッドは、2つの文字列を結合して新しい文字列を返す
compareTo() 2つの文字列を比較する
Copy() この静的メソッドは、既存の文字列の新しいコピーを返す
Format() 他の要素(数値データ、他の文字列)と、本章の前半で説明した{0}とい う書式を使って、文字列を書式化するために使う
Insert() 文字列に他の文字列を挿入するために使う
PadLeft()
PadRight()
これらのメソッドは、文字列を他の文字列でパディングするために使われる
Remove(),Replace() これらのメソッドを使って、変更(文字の削除や置換)を加えた文字列のコピーを取得する
Toupper(),ToLower() 文字列の大文字または小文字のコピーを作成する

C#の文字列操作には、いくつか注意してほしいことがあります。まず、文字列データは参照タイプですが、比較演算子(==および!=)は、それらが参照しているメモリではなく、文字列オブジェクトの値を比較するために定義されています。加算演算子(+)は、Concat()の短縮呼び出しとしてオーバーロードされています。

//=;および!=は、文字列の内容を比較するために使われます
// +は、連結のために使われます
public static int Wain(string[] args) 
{ 
    System.String strObj = "This is a TEST"; 
    strlng s = "This is another TEST"; 
    //文字列が等しいかどうかテストします
    if(s == strObj) 
        Console.WriteLine("Same info..."); 
    else 
        Console.WriteLine("Not the same info...");

  // 連結します 
  string newString = s + strObj; 
  Console WriteLine("s + strObj = {0}",newString);

  //System.Stringは、文字列内の個々の文字をアクセス
  //するためにカスタムインデクサも定義しています
  for(int k = 0; k < s.Length; k++) 
	Console WriteLine("Char {0} is {1}", k, s[k]);
 
  return 0; 
}

このプログラムを実行すると、2つの文字列オブジェクト(sおよびstrObj)が同じ値でないことを確認できます。したがって、一致のテストは不合格になります。newStringの内容を調べると、“This is another TestThis is s TEST"となっていることがわかります。最後に、インデックス演算子([])を使って文字列の個々の文字にアクセスできることに も注目してください。

第2章目次へ

エスケープ文字とエスケープ文字の禁止

C/C++やJavaと同様に、C#の文字列は、任意の数のエスケープ文字を含むことができ ます。

// エスケープ文字 (\t, \\, \nなど) 
string anotherString; 
anotherString = "Every programmlng book needs \"Hello World \"";
Console.WriteLine( "\t" + anotherString); 
anotherStrlng = "c:\\CSharpProjects\\Strings\\string.cs"; 
Console.WriteLine( "\t" + anotherString); 

表2−12 文字列のエスケープ文字
エスケーブ文字説 明
\' 文字列リテラルにシングルクォーテーションを挿入する
\" 文字列リテラルにダブルクォーテーションを挿入する
\\ 文字列リテラルに\記号を挿入。ファイルのバスを指定する場合に便利
\a システムのビープ音をトリガする
\b バックスペースをトリガする
\f 用紙送りをトリガする
\n 改行を挿入する
\r 復帰を挿入する
\t 文字列リテラルに水平タブを挿入する
\u 文字列リテラルにUnicode文字を挿入する
\V 文字列リテラルに垂直タブを挿入する
\0 NULL文字を表す

古典的なエスケープ文字に加えて、C判こは、@記号を使った文字列リテラルの表現方法があります。@プレフィクスの付いた文字列を“verbatim string"と呼びます。verbatim stringを使うと、エスケープ文字の効果を無効にすることができ、リテラルを以下のように定義できます。

// @文字列は、エスケープ文字の機能を無効にします
string finalString = @"\n\tString file: 'C:\CSharpProjects\Strings\string.cs'"; 
Console.WriteLine(finalString); 

このプログラムの出カの先頭に“\n\t"が付いていることに注目してください。これらのエスケープ文字は、@付き文字列では処理されません。

第2章目次へ

System.Text.StringBuilderの使い方

C#の文字列に関して、特に注意すべきことが1つあります。設定された文字列の値を変更できないということです。Javaと同様に、C#の文字列は不変のものです。事実、System.Stringのメソッドを調べてみると、メソッドが、文字列の内部を変更し、変更後の文字列のコピーを返すものであることに気が付くでしょう。たとえば、文字列オブジェクトにToUpper()のメッセージを送ると、内部のバッファが変更されるのではなく、大文字に変換されたバッファの新しいコピーが返されます。

//この文字列を変更するのでしょうか? いいえ、実際には...
System.String strFixed = "This is how I began life"; 
Console.WriteLine(strFixed); 

string upperVersion = strFixed.ToUpper()   // strFixedの大文字のコピーが返されます 
Console.WriteLine(strFixed); 
Console.WriteLine(upperVersion);

文字列のコピーのコピーを使わなければならないのでは、少々問題になる場合があります。この問題を解決するために、System.Text名前空問が、StringBui1derという名前のクラスを定義しています。このクラスは、MFCのCStringやATLのCComBSTRによく似た機能を提供します。StringBuilderのインスタンスに対して行った変更は、すべて内部のバッファに適用されます(すなわち、より効率的です)。

// StringBuilderクラスの使い方 
using System; 
using System.Text;   // StringBuilderは、ここにあります! 

class StringApp 
( 
    public static int Main(string[] args) 
    { 
	// StringBuilderを作成し、内部バッファーを変更します
	StringBuilder myBuffer = new StringBuilder("I am a buffer") ; 
	myBuffer.Append(" that just got longer..."); 
	Console.WriteLine(myBuffer); 
	return 0; 
    } 
} 

内部バッファに追加を行うだけでなく、StringBuilderクラスは、文字の置換や削除ができます。バッファの状態を設定したら、ToString()を呼び出して、最終的な結果をSystem.Stringデータタイプに代入することもできます。

// StringBuilderクラスの使い方 
using System; 
using system.Text;   // StringBuilderは、ここにあります

class stringApp 
{ 
  public static int Main(string[] args) 
  { 
	// さらにstringBuilderの機能を使います, . . 
	StringBuilder myBuffer = new StringBuilder("I am a buffer"); 

	myBuffer.Append(" that just got longer... " ) ; 
	Console.WriteLine(myBuffer);
 
	myBuffer.Append ("and even longer."); 
	Console.WriteLine(myBuffer);
 
	// バッファーを大文字の固定文字列に変換します 
	string theReallyFinalString = myBuffer.Tostring().ToUpper(); 
	Console.WriteLine(theReallyFinalString); 
	return 0; 
  } 
} 

第2章目次へ