2

次のコードは、メソッドが呼び出されてtrueと評価されるたびに、3つの新しい文字列を作成しますか、それとも右側の文字列を定数にコンパイルするのに十分スマートなコンパイルですか?

if (somestring == "Test" || someString == "Test1")
{
   ...
   NotifyPropertyChanged("Name");
}
4

2 に答える 2

7

それらはリテラルです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命令の結果が、まったく同じ文字列オブジェクトを返すことを保証します(「文字列インターン」と呼ばれるプロセス)。

于 2012-07-30T19:50:08.160 に答える
5

文字列をインターンします。

共通言語ランタイムは、プログラムでプログラムで宣言または作成された一意のリテラル文字列ごとに1つの参照を含む、インターンプールと呼ばれるテーブルを維持することにより、文字列ストレージを節約します。したがって、特定の値を持つリテラル文字列のインスタンスは、システムに1回だけ存在します。

http://msdn.microsoft.com/en-us/library/system.string.intern.aspx

http://broadcast.oreilly.com/2010/08/understanding-c-stringintern-m.html

于 2012-07-30T19:49:59.343 に答える