سوء استخدام Null ائتلافه المشغل ؟
-
22-09-2019 - |
سؤال
myFoo = myFoo ?? new Foo();
بدلا من
if (myFoo == null) myFoo = new Foo();
أنا على حق في التفكير في أن السطر الأول من التعليمات البرمجية سوف تؤدي دائما مهمة ؟ أيضا, هل هذا سوء استخدام null-ائتلافه المشغل ؟
المحلول
لقد قارنت CIL للرمز الذي تم إنشاؤه (مع التأكد من القيام ببناء إصدار - مع فحص رمز تحسين في خصائص المشروع ، والتي تتوافق مع /optimize
شغل csc.exe
). هذا ما حصلت عليه (باستخدام VS 2008 - لاحظ ذلك Foo.MaybeFoo()
هي طريقة تعود في بعض الأحيان null
, ، في بعض الأحيان أ Foo
)
GetFooWithIf
:
IL_0000: call class Application3.Foo Application3.Foo::MaybeFoo()
IL_0005: stloc.0
IL_0006: ldloc.0
IL_0007: brtrue.s IL_000f
IL_0009: newobj instance void Application3.Foo::.ctor()
IL_000e: stloc.0
IL_000f: ldloc.0
IL_0010: ret
GetFooWithCoalescingOperator
:
IL_0000: call class Application3.Foo Application3.Foo::MaybeFoo()
IL_0005: stloc.0
IL_0006: ldloc.0
IL_0007: dup
IL_0008: brtrue.s IL_0010
IL_000a: pop
IL_000b: newobj instance void Application3.Foo::.ctor()
IL_0010: stloc.0
IL_0011: ldloc.0
IL_0012: ret
وبالتالي ، فإن الشيء نفسه باستثناء إضفاء الطابع الإضافي على أعلى المكجمات والبوب. إذا كان من الممكن صنع هذا لإحداث فرق في الأداء القابل للقياس ، فسوف أشتري قبعة خصيصًا لغرض تناوله ؛ لذلك ، اذهب مع الشخص الذي تشعر أنه يوفر قابلية للقراءة بشكل أفضل.
(تحرير) أوه ، وقد يكون الارتعاش ذكيًا بما يكفي للتخلص من هذا الاختلاف!
نصائح أخرى
أنا لا أعتقد أن هذا سوء استخدام null-ائتلافه المشغل.عند قراءة رمز ، فمن قصيرة وموجزة ممكن القصد من القانون هو واضح.
فمن الصحيح أن استخدام null-ائتلافه المشغل مثل هذا, سوف تحصل دائما مهمة ، ولكن أود أن لا تقلق بشأن ذلك.(وإذا كان حقا تبين أن مشكلة أداء ، كنت تعرف كيفية إصلاح ذلك).
أنت محق في أن السطر الأول سيقوم دائمًا بإجراء مهمة. لن أقلق بشأن ذلك ما لم يتم تنفيذ الكود في كثير من الأحيان.