システム開発・Webサイト構築 プラスラス

2007/7/30 月曜日

【.NET】文字列(String)についての注意

このエントリーを含むはてなブックマーク Yahoo!ブックマークに登録 Google ブックマーク del.icio.us

.NETでのSystem.String(VB.NETのStringやC#のstring)については注意が必要です。

System.Stringについての注意

System.Stringクラスは、作成時以降に値を変更できません。

たとえば文字列の連結をするようなプログラムでは、変更できているかのようにも見えますが、実際には変更後の値を新しいインスタンスとして作成しており、元のインスタンスに対して変更を加えるわけではありません。

少々の処理では全く気にする必要はありませんが、文字列に対して非常に多くの操作を行うようなケースでは、インスタンスの生成と破棄の負荷が問題となります。

そのような場合は、実際にオブジェクトの内容を変更可能なSystem.Text.StringBuilderクラスを使用してください。

Win32 APIなどアンマネージドな関数の中で値を変える場合も、System.Stringは使用できません。

文字列を連結する

VB.NETでは、&演算子で、C#では+演算子で文字列の連結が可能です。

'VB.NETのサンプル

Dim str As String

str = "あいうえお"

str = str & "かきくけこ"

'(str &= "かきくけこ"でも同意)

MsgBox(str)
//C#のサンプル

string str;

str = "あいうえお";

str = str + "かきくけこ"; 

//(str += "かきくけこ";でも同意)

MessageBox.Show(str);

VB.NETでは、+でも文字列の連結をすることができますが、&で書いた方が無難です。 & による文字列の連結では、片側のオペランドが文字列ではない場合はToStringメソッドの結果を結合するようになっています。

ところが、+を使用した場合は、片側が文字列ではないときはDoubleに変換して加算しようとします。この動作はわかりにくいため、使用しない方が良いでしょう

2つの文字列が等価であるかどうかを判断する

等価(値が同一かどうか)は、VB.NETでは=で、C#では==で比較できます。

非等価(値が非同一かどうか)は、VB.NETでは<>で、C#では!=で比較できます。

'VB.NETのサンプル

Dim str As String = "ABC"

If str = "ABC" Then

   MsgBox("文字列はABCです。")

End If

If str <> "ABC" Then

   'ここは実行されない
   MsgBox("文字列はABCではありません。")

End If
//C#のサンプル

string str = "ABC";

if( str == "ABC")
{
   MessageBox.Show("文字列はABCです。");
}

if( str != "ABC")
{
   //ここは実行されない
   MessageBox.Show("文字列はABCではありません。");
}

C#の==演算子は、Javaとは異なりString.Equals(String)メソッドと同じです。

また、VB.NETの比較演算子は、Option Compareの指定によって振る舞い(Binary/Text)が変わります。たとえばTextが指定されていると大文字と小文字を区別しません。Equals(String)メソッドはOption Compareの影響を受けず、常にカルチャに依存しない比較です。

.NETでは、同じ文字列を示すSystem.String型の変数は、必ず同一のインスタンスとなるため、あまり意味がありませんが、あえて参照の比較を行うには、Object.ReferenceEqualsを使用することで可能です。

Filed under: C#,Programming,VB.NET — Nakai @ 7:55:26

コメントはまだありません »

コメントはまだありません。

この投稿へのコメントの RSS フィード。 TrackBack URL

コメントする

HTML convert time: 0.811 sec. Powered by WordPress