2009-11-24 9 views
8
myFoo = myFoo ?? new Foo(); 

नल कोलेसिंग ऑपरेटर का बुरा उपयोग?

if (myFoo == null) myFoo = new Foo(); 

के बजाय

हूँ मैं में सही कर यह सोच कर कि कोड की पहली पंक्ति हमेशा एक काम प्रदर्शन करेंगे? इसके अलावा, क्या यह नल-कोलेसिंग ऑपरेटर का खराब उपयोग है?

+6

आप इस मामले में '?? =' ऑपरेटर :) –

+0

@PavelMinaev के लिए एक ठोस तर्क देते हैं, यह '|| =' ऑपरेटर के समान नहीं है? इसे 'if (! Isset (myFoo)) myFoo = new foo();' अपने ऑपरेटर –

+0

पर वारंट करने के लिए 'कॉल करना होगा, क्योंकि यह एक समान है, क्योंकि' || 'को एक बूलियन मान की आवश्यकता है। –

उत्तर

19

मैंने जेनरेट कोड के सीआईएल की तुलना की है (एक रिलीज बिल्ड करना सुनिश्चित करना - परियोजना गुणों में ऑप्टिमाइज़ कोड के साथ, /optimizecsc.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) मिल गया है एक अतिरिक्त टॉप-ऑफ-स्टैक-डुप्लिकेशन और पॉप को छोड़कर। यदि इसे मापने योग्य प्रदर्शन अंतर बनाने के लिए बनाया जा सकता है, तो मैं विशेष रूप से इसे खाने के उद्देश्य के लिए टोपी खरीदूंगा; इसलिए, उस व्यक्ति के साथ जाएं जिसे आप बेहतर पठनीयता प्रदान करते हैं।

(संपादित करें) ओह, और जिटर शायद उस अंतर से छुटकारा पाने के लिए पर्याप्त चालाक हो सकता है!

+0

क्या यह 'csc.exe/optimize +' के साथ है? –

+0

मुझे ऐसा लगता है, स्पष्ट करने के लिए संपादित किया गया। – AakashM

+0

मुझे नहीं पता कि वास्तव में कितना बड़ा फू है। क्या इसका आकार डुप्लिकेट और पॉप चलाने के लिए समय को प्रभावित करता है? कोड में – Gary

4

आप सही हैं कि पहली पंक्ति हमेशा एक असाइनमेंट करेगी। मैं तब तक चिंता नहीं करता जब तक कि कोड को अक्सर निष्पादित नहीं किया जाता है।

+0

संकलक को इसे अनुकूलित करने से क्या रोकना चाहिए? – Timbo

+0

@ टिम्बो: मैं बहुत समझदार नहीं हूं कि संकलक कौन सा अनुकूलन कर सकता है या नहीं कर सकता है, लेकिन मैं यह मानता हूं कि कोड में कहीं और 'myFoo' का उपयोग किया जाएगा और यह संकलक को इसे अनुकूलित करने से रोक देगा। अगर इसका इस्तेमाल कहीं और नहीं किया जाता है, तो यह एक अलग कहानी है। –

6

मुझे यह नहीं लगता कि यह नल-कोलेसिंग ऑपरेटर का खराब उपयोग है। कोड पढ़ने पर, यह जितना संभव हो उतना छोटा और संक्षिप्त होता है, और कोड का इरादा स्पष्ट है।

यह सही है कि इस तरह के नल-कोलेसिंग ऑपरेटर का उपयोग करके, आपको हमेशा एक असाइनमेंट मिल जाएगा, लेकिन मैं इसके बारे में चिंता नहीं करता। (और यदि यह वास्तव में एक प्रदर्शन समस्या बन गया है, तो आप पहले से ही इसे ठीक करने के बारे में जानते हैं)।

संबंधित मुद्दे