質問

C#が一定の文字列の連結のための任意のコンパイル時の最適化をするのでしょうか?もしそうなら、どのように書かれたことにより、私のコードは、この利点を取る必要があります?

例:?これらは、実行時に比較するにはどうすればよいです。

Console.WriteLine("ABC" + "DEF");

const string s1 = "ABC";
Console.WriteLine(s1 + "DEF");

const string s1 = "ABC";
const string s2 = s1 + "DEF";
Console.WriteLine(s2);
役に立ちましたか?

解決

はい、それはありません。あなたは、コードを検査するildasmや反射板を使用して使用してこれを確認することができます。

static void Main(string[] args) {
    string s = "A" + "B";
    Console.WriteLine(s);
}

に変換されます。

.method private hidebysig static void  Main(string[] args) cil managed {
    .entrypoint
    // Code size       17 (0x11)
    .maxstack  1
    .locals init ([0] string s)
    IL_0000:  nop
    IL_0001:  ldstr      "AB" // note that "A" + "B" is concatenated to "AB"
    IL_0006:  stloc.0
    IL_0007:  ldloc.0
    IL_0008:  call       void [mscorlib]System.Console::WriteLine(string)
    IL_000d:  nop
    IL_000e:  br.s       IL_0010
    IL_0010:  ret
} // end of method Program::Main

たまたまもっと面白いものが関連があります。あなたはアセンブリ内の文字列リテラルを使用している場合、CLRはアセンブリで、同じリテラルのすべてのインスタンスに対して1つのオブジェクトを作成します。

したがってます:

static void Main(string[] args) {
    string s = "A" + "B";
    string t = "A" + "B";
    Console.WriteLine(Object.ReferenceEquals(s, t)); // prints true!
}

コンソールに「真」に印刷されます!この最適化は、文字列のインターンに呼ばれます。

他のヒント

によるリフレクターするます:

Console.WriteLine("ABCDEF");
Console.WriteLine("ABCDEF");
Console.WriteLine("ABCDEF");

でも、デバッグ構成でます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top