मैंने जेनरेट कोड के सीआईएल की तुलना की है (एक रिलीज बिल्ड करना सुनिश्चित करना - परियोजना गुणों में ऑप्टिमाइज़ कोड के साथ, /optimize
csc.exe
पर स्विच करें)।
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
इस प्रकार,
GetFooWithIf
- यह है कि मैं क्या (ध्यान दें Foo.MaybeFoo()
एक एक Foo
विधि है कि कभी कभी रिटर्न null
, कभी कभी यह है कि का उपयोग कर वी.एस. 2008) मिल गया है एक अतिरिक्त टॉप-ऑफ-स्टैक-डुप्लिकेशन और पॉप को छोड़कर। यदि इसे मापने योग्य प्रदर्शन अंतर बनाने के लिए बनाया जा सकता है, तो मैं विशेष रूप से इसे खाने के उद्देश्य के लिए टोपी खरीदूंगा; इसलिए, उस व्यक्ति के साथ जाएं जिसे आप बेहतर पठनीयता प्रदान करते हैं।
(संपादित करें) ओह, और जिटर शायद उस अंतर से छुटकारा पाने के लिए पर्याप्त चालाक हो सकता है!
आप इस मामले में '?? =' ऑपरेटर :) –
@PavelMinaev के लिए एक ठोस तर्क देते हैं, यह '|| =' ऑपरेटर के समान नहीं है? इसे 'if (! Isset (myFoo)) myFoo = new foo();' अपने ऑपरेटर –
पर वारंट करने के लिए 'कॉल करना होगा, क्योंकि यह एक समान है, क्योंकि' || 'को एक बूलियन मान की आवश्यकता है। –