سؤال

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-ائتلافه المشغل مثل هذا, سوف تحصل دائما مهمة ، ولكن أود أن لا تقلق بشأن ذلك.(وإذا كان حقا تبين أن مشكلة أداء ، كنت تعرف كيفية إصلاح ذلك).

أنت محق في أن السطر الأول سيقوم دائمًا بإجراء مهمة. لن أقلق بشأن ذلك ما لم يتم تنفيذ الكود في كثير من الأحيان.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top