次のコードは、メソッドが呼び出されてtrueと評価されるたびに、3つの新しい文字列を作成しますか、それとも右側の文字列を定数にコンパイルするのに十分スマートなコンパイルですか?
if (somestring == "Test" || someString == "Test1")
{
...
NotifyPropertyChanged("Name");
}
それらはリテラルですldstr
。つまり、オペコードがロードされます。
ldstr "Test1"
これの影響は次のとおりです。通過するものldstr
はすべて自動的にインターンされるので、これを行うことができます。
string x = "abc";
string y = "abc";
bool sameInstance = ReferenceEquals(x,y); // true
したがって、はい、そのメソッドが初めて使用されるとき、リテラル"Test"
、"Test1"
および"Name"
が作成される可能性がありますが、1回だけです。その後、同じ既存の文字列インスタンスが使用されます。これは以下によって保証されldstr
ます:
共通言語基盤(CLI)は、同じ文字シーケンスを持つ2つのメタデータトークンを参照する2つのldstr命令の結果が、まったく同じ文字列オブジェクトを返すことを保証します(「文字列インターン」と呼ばれるプロセス)。
文字列をインターンします。
共通言語ランタイムは、プログラムでプログラムで宣言または作成された一意のリテラル文字列ごとに1つの参照を含む、インターンプールと呼ばれるテーブルを維持することにより、文字列ストレージを節約します。したがって、特定の値を持つリテラル文字列のインスタンスは、システムに1回だけ存在します。
http://msdn.microsoft.com/en-us/library/system.string.intern.aspx
http://broadcast.oreilly.com/2010/08/understanding-c-stringintern-m.html