【.NET】文字列(String)についての注意
.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を使用することで可能です。
TrackBack URL :
Comments (0)