文字列定数についてはC#のコンパイル時連結
-
21-09-2019 - |
質問
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");
でも、デバッグ構成でます。
所属していません StackOverflow