2009-12-11 9 views
6

क्या निम्नलिखित 2 कोड स्निपेट एक ही चीज़ प्राप्त करते हैं?क्या ये 2 कथन समान हैं?

मेरे मूल कोड:

if (safeFileNames != null) 
{ 
    this.SafeFileNames = Convert.ToBoolean(safeFileNames.Value); 
} 
else 
{ 
    this.SafeFileNames = false; 
} 

क्या ReSharper सोचा एक बेहतर विचार था:

this.SafeFileNames = safeFileNames != null && 
        Convert.ToBoolean(safeFileNames.Value); 

मुझे लगता है कि इसके बाद के संस्करण कोड बहुत आसान को पढ़ने के लिए है, किसी भी बाध्यकारी कारण इसे बदलने के लिए?
क्या यह तेजी से निष्पादित होगा, और सबसे महत्वपूर्ण बात यह है कि कोड एक ही चीज़ करेगा?

यदि आप इसे देखते हैं: Convert.ToBoolean(safeFileNames.Value); अनुभाग, तो निश्चित रूप से यह एक शून्य संदर्भ अपवाद का कारण बन सकता है?

this.SafeFileNames = bool 

स्थानीय safeFileNames एक जोरदार टाइप किया कस्टम वस्तु, यहाँ है वर्ग है:

public class Configuration 
    { 
     public string Name 
     { 
      get; 
      set; 
     } 
     public string Value 
     { 
      get; 
      set; 
     } 
    } 
+3

आप नहीं मिलेगा एक 'NullReferenceExcepton' पहले भाग के बाद से कथन का 'सुरक्षितफाइल नाम! = नल' शॉर्ट-सर्किट आउट होगा और आप कभी भी कन्वर्ट नहीं करेंगे। ToBoolean (safeFileNames.Value) '- वह वा वाई एंड एंड काम करता है। – Nate

+2

सी # के आलसी मूल्यांकन के कारण यह एक शून्य संदर्भ अपवाद नहीं करेगा। && कथन हमेशा बाईं तरफ बाईं ओर मूल्यांकन किया जाता है। लेकिन यदि बाएं तरफ झूठ है, तो यह सही पक्ष का मूल्यांकन करने से परेशान नहीं होगा, क्योंकि तार्किक परिणाम पहले ही निर्धारित है। इसलिए, अगर सुरक्षितफाइल नाम शून्य है तो कनवर्ट करें। ToBoolean कॉल कभी नहीं बनाया जाता है। इस तरह की चीज कोड में काफी आम है। –

+1

तो अगर मैं समझ रहा हूं && - यदि बाएं भाग झूठा है तो यह झूठा रिटर्न देता है ... अन्यथा यह सही हिस्से का मूल्यांकन करता है, और सही हिस्से का परिणाम देता है? –

उत्तर

24

तथ्य यह है कि आपने सवाल पूछा है कि मुझे प्राथमिकता दी जाती है कि पूर्व को प्राथमिकता दी जाती है। यही है, ऐसा लगता है कि आपका प्रश्न यह दर्शाता है कि आप मानते हैं कि पहला कोड समझना आसान है, और आप निश्चित नहीं हैं कि दूसरा बराबर है या नहीं। सॉफ्टवेयर डिजाइन का एक प्राथमिक लक्ष्य जटिलता का प्रबंधन करना है। यदि यह अब आपको भ्रमित कर रहा है, तो यह बाद में आपके लिए भी हो सकता है, या जो भी सड़क के नीचे आपके कोड का समर्थन करता है।

+4

यह एक अच्छा जवाब है। – jason

+0

+1 कोआईएसएस [15] –

+0

इसे देखने का बहुत अच्छा तरीका है। –

5

दोनों बयान बिल्कुल वही चीज़ करते। उपयोग करने के लिए वरीयता का मामला है, लेकिन मैं Resharper के संस्करण को प्राथमिकता देता हूं। अधिक संक्षेप में, कम चलती भागों। कोड के इरादे को देखना आसान है।

+0

क्या होगा यदि यह। SfeFileNames शून्य है? निश्चित रूप से कनवर्ट करने की कोशिश कर रहा है। एक शून्य पर ToBoolean, एक शून्य संदर्भ अपवाद का कारण होगा? –

+0

@ जेएल: दूसरा खंड कभी निष्पादित नहीं होगा अगर सुरक्षितफाइल नाम शून्य थे – Randolpho

+0

जीत के लिए लघु सर्किटिंग। –

1

वे वही हैं। & & एक शॉर्ट सर्किटिंग ऑपरेटर है, इसलिए अभिव्यक्ति का दूसरा भाग मूल्यांकन नहीं करेगा यदि सुरक्षितफाइल नाम शून्य है।

1

वे वही हैं। एक लाइनर में, यदि पहली स्थिति विफल हो जाती है, तो दूसरे का मूल्यांकन नहीं किया जाता है। तो आपको एक शून्य संदर्भ नहीं मिलता है।

मुझे लगता है कि आईएल दोनों मामलों में समान है।

मैं दूसरा संस्करण पसंद करता हूं।

2

यह रिशेर्पर सुझाव का उपयोग करके आपके कोड की चक्रीय जटिलता को कम करता है।

चाहे इसे पढ़ना आसान हो या नहीं, व्यक्तिगत राय है, हालांकि मैं सुझाव रिशेर्पर आपको पसंद करता हूं।

वे समान हैं, और यदि आप पठनीयता चाहते हैं, मैं भी निम्नलिखित सुझाव दे सकता है:

if (safeFileNames != null) 
    this.SafeFileNames = Convert.ToBoolean(safeFileNames.Value); 
else 
    this.SafeFileNames = false; 

या

this.SafeFileNames = safeFileNames != null ? Convert.ToBoolean(safeFileNames.Value) : false 
+0

नोट: जब वे अनावश्यक होते हैं तो मुझे ब्रेसिज़ को हटाते हुए कोड बेहतर दिखता है, फिर से, बहुत राय आधारित। –

+0

@Aukutarium, आपका उत्तर गलत या अक्षम नहीं है। यह दूसरों के जितना रोमांचक नहीं है, मुझे लगता है। आपको वोट देना –

+0

यह एक राय है, लेकिन ध्यान देने योग्य है कि स्टाइलकॉप इसे एक त्रुटि के रूप में ध्वजांकित करेगा। संगति एक कारक है; दूसरा एक त्रुटि पेश कर रहा है जब आप अपना दूसरा कथन किसी अन्य में जोड़ते हैं (बिना किसी और के) और अपनी ब्रेसिज़ को भी जोड़ना भूल जाते हैं। आईडीई आमतौर पर इसे इंडेंट करेगा और आपको सूचित करेगा, लेकिन यदि आप विजुअल नोटपैड का उपयोग कर रहे हैं .... –

1

हाँ दोनों उन बयानों एक ही बात करेंगे, तुम नहीं सुसमाचार के रूप में पुन: तेज सुझाव लेना है, जो व्यक्ति एक पठनीय कोड मानता है वह एक और मनुष्य गड़बड़ है।

ऐसा करने के कुछ और तरीके हैं जो करने की कोशिश कर रहे हैं जो अधिक पठनीय हो सकते हैं, किस प्रकार का मूल्य सुरक्षित है FileNames? ऐसा लगता है कि यह एक नालीदार बूल हो सकता है?यदि ऐसा है तो आप बस लिख सकते हैं,

this.SafeFileNames = safeFileNames.GetValueOrDefault(); 
0

तर्कसंगत रूप से, वे समान हैं। कोई भी प्रदर्शन अंतर संभवतः लापरवाह होगा। यह संभव है कि दूसरा फॉर्म कुछ प्लेटफॉर्म पर अधिक कुशल बाइनरी कोड में अनुवाद करेगा क्योंकि दूसरा फॉर्म सशर्त से दूर है। कंडीशनल (गलत सट्टा निष्पादन) सीपीयू-गहन काम में आपके सीपीयू की निर्देश पाइपलाइन को गड़बड़ कर सकता है। हालांकि, आईएल और जेआईटर दोनों को बहुत अंतर बनाने के लिए पर्याप्त गुणवत्ता के कोड को उत्सर्जित करने की आवश्यकता है।

मैं आपकी पठनीयता की भावना से सहमत हूं, लेकिन मुझे लगता है कि हर कोई इसे साझा नहीं करता है।

5

यहां कोड के दोनों टुकड़ों के लिए आईएल है। मैंने अपना कोड लिया और आईएल को देखने के लिए एक कंसोल ऐप बनाया। जैसा कि आप परिणामी आईएल से देख सकते हैं, एक विधि (विधि 2) 4 बाइट कम है, लेकिन आईएल जो दोनों के लिए चलता है वह काफी समान है, इसलिए जहां तक ​​प्रदर्शन चलता है ... इसके बारे में चिंता न करें। वे दोनों एक ही प्रदर्शन करेंगे। इस पर अधिक ध्यान केंद्रित करें कि कौन सा पढ़ना आसान है और आपके इरादे को बेहतर ढंग से प्रदर्शित करता है।

मेरे कोड:

.method public hidebysig instance void method1() cil managed 
{ 
    // Code size  42 (0x2a) 
    .maxstack 1 
    .locals init ([0] valuetype [mscorlib]System.Nullable`1<bool> safeFileNames) 
    IL_0000: ldloca.s safeFileNames 
    IL_0002: initobj valuetype [mscorlib]System.Nullable`1<bool> 
    IL_0008: ldloca.s safeFileNames 
    IL_000a: call  instance bool valuetype [mscorlib]System.Nullable`1<bool>::get_HasValue() 
    IL_000f: brfalse.s IL_0023 
    IL_0011: ldloca.s safeFileNames 
    IL_0013: call  instance !0 valuetype [mscorlib]System.Nullable`1<bool>::get_Value() 
    IL_0018: call  bool [mscorlib]System.Convert::ToBoolean(bool) 
    IL_001d: call  void ConsoleApplication5.Program::set_SafeFileNames(bool) 
    IL_0022: ret 
    IL_0023: ldc.i4.0 
    IL_0024: call  void ConsoleApplication5.Program::set_SafeFileNames(bool) 
    IL_0029: ret 
} // end of method Program::method1 

Method2 के लिए आईएल::

class Program 
{ 
    static void Main(string[] args) 
    { 


    } 
    public void method1() 
    { 
     bool? safeFileNames = null; 

     if (safeFileNames != null) 
     { 
      SafeFileNames = Convert.ToBoolean(safeFileNames.Value); 
     } 
     else 
     { 
      SafeFileNames = false; 
     } 
    } 
    public void method2() 
    { 
     bool? safeFileNames = null; 
     SafeFileNames = safeFileNames != null && Convert.ToBoolean(safeFileNames.Value); 
    } 
    public static bool SafeFileNames { get; set; } 
} 

विधि 1 के लिए आईएल

.method public hidebysig instance void method2() cil managed 
{ 
    // Code size  38 (0x26) 
    .maxstack 1 
    .locals init ([0] valuetype [mscorlib]System.Nullable`1<bool> safeFileNames) 
    IL_0000: ldloca.s safeFileNames 
    IL_0002: initobj valuetype [mscorlib]System.Nullable`1<bool> 
    IL_0008: ldloca.s safeFileNames 
    IL_000a: call  instance bool valuetype [mscorlib]System.Nullable`1<bool>::get_HasValue() 
    IL_000f: brfalse.s IL_001f 
    IL_0011: ldloca.s safeFileNames 
    IL_0013: call  instance !0 valuetype [mscorlib]System.Nullable`1<bool>::get_Value() 
    IL_0018: call  bool [mscorlib]System.Convert::ToBoolean(bool) 
    IL_001d: br.s  IL_0020 
    IL_001f: ldc.i4.0 
    IL_0020: call  void ConsoleApplication5.Program::set_SafeFileNames(bool) 
    IL_0025: ret 
} // end of method Program::method2 
+1

यदि मैं इसे 1 से अधिक बिंदु दे सकता हूं तो मुझे लगता है कि जब लोग वास्तविक मतभेद निर्धारित करने के लिए आईएल की जांच करते हैं तो मुझे पसंद है। चरम प्रयास के लिए –

+0

+1, और बहुत धन्यवाद! –

+0

ildasm को धूलने और थोड़ी देर के लिए खेलने के लिए एक अच्छा बहाना जैसा लगता है :-) – jvilalta

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