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 بإنشاء كائن واحد فقط لجميع مثيلات نفس الحرفي في التجميع.
هكذا:
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