2010-05-07 15 views
12

मैं अपने संकलित सी # कोड को पढ़ने की कोशिश कर रहा हूं।सी #, अजीब अनुकूलन

using(OleDbCommand insertCommand = new OleDbCommand("...", connection)) 
{ 
    // do super stuff 
} 

लेकिन:

यह मेरा कोड है!

हम सभी जानते हैं कि एक का उपयोग कर इस में अनुवाद किया जाता है:

{ 
    OleDbCommand insertCommand = new OleDbCommand("...", connection) 
    try 
    { 
     //do super stuff 
    } 
    finally 
    { 
     if(insertCommand != null) 
      ((IDisposable)insertCommand).Dispose(); 
    } 
} 

(के बाद से OleDbCommand एक संदर्भ प्रकार है)।

लेकिन जब मैं अपने विधानसभा डिकंपाइल (.NET 2.0 के साथ संकलित) मैं Resharper में यह मिलता है:

try 
{ 
    insertCommand = new OleDbCommand("", connection); 
Label_0017: 
    try 
    { 
     //do super stuff 
    } 
    finally 
    { 
    Label_0111: 
     if ((insertCommand == null) != null) 
     { 
      goto Label_0122; 
     } 
     insertCommand.Dispose(); 
    Label_0122:; 
    } 

मैं इस लाइन के बारे में बात कर रहा हूँ: if ((insertCommand == null) != null)

मान लें कि सम्मिलित है COMOM IS शून्य है। फिर पहला भाग सच हो जाता है। (true != null)true देता है। तो फिर निपटान अभी भी छोड़ दिया गया है? अजीब, बहुत अजीब।

अगर मैं दृश्य स्टूडियो में इस पेस्ट, Resharper पहले से ही मुझे चेतावनी देते हैं: अभिव्यक्ति हमेशा सच है ...

धन्यवाद!

-Kristof

+0

मैंने प्रश्न को गलत तरीके से पढ़ा है, इसलिए मेरा जवाब हटा दिया गया है। मुझे लगता है कि रिशेर्पर में एक बग है, मैं कुछ अन्य डिकंपेलर की कोशिश करने का सुझाव दूंगा और देख सकता हूं कि आपको क्या परिणाम मिलते हैं। –

+1

डिकंपाइल करने के लिए आप किस टूल का उपयोग करते हैं ?? शायद आपको एक और –

उत्तर

12

decompiler एक बग है। इस लाइन

if ((insertCommand == null) != null) 

if ((insertCommand == null) != false) 

जो करने के लिए decompiled किया जाना चाहिए था, हालांकि बेकार में वर्बोज़, कम से कम सही कोड है।

क्योंकि सी # संकलक अक्सर फेंकना

if (x) 
    Y(); 
Z(); 

चुनता है जैसे कि आप

if (!x) 
    goto L; 
Y(); 
L: Z(); 

लिखा था के बाद से दोनों कार्यक्रमों के लिए तैयार किए गए कोड में ही है decompiler शायद इस अनावश्यक रूप से वर्बोज़ संस्करण करता है , decompiler हमेशा यह नहीं जानता कि प्रदर्शित करने के लिए कौन सा समझदार कोड है।

अप्रत्याशित कारण "!= झूठा "ऐसा इसलिए है क्योंकि जब हम आईएल उत्पन्न करते हैं जो परीक्षण करता है कि कुछ सच है, तो सबसे तेज़ और सबसे कॉम्पैक्ट कोड जो हम उत्पन्न कर सकते हैं यह जांचना है कि यह गलत नहीं है। गलत में आईएल में शून्य के रूप में प्रतिनिधित्व किया जाता है, और इसके लिए एक सस्ता निर्देश है" यह बात शून्य है? "

+0

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

+1

@ ब्रायन: कंपाइलर के पास गेटोस से बचने का कोई तरीका नहीं है; * अगर एक कथन एक गोटो * है। एक कथन कथन एक सशर्त गेटो लिखने का एक सुखद तरीका है; अपने आप को यह सोचने में मूर्ख मत बनो कि यह इसके अलावा कुछ भी है। उस ने कहा, एक डिकंपेलर के लिए एक अच्छा ह्युरिस्टिक उस कोड को डिकंपाइल करना है जब उपयोगकर्ता संदिग्ध होने पर अधिक संभावना लिखता है। बग यह है कि शून्य के पूर्णांक की तुलना का विघटन शून्य की तुलना के रूप में उत्पन्न किया जा रहा है, जो कानूनी सी # नहीं है। इसे झूठी तुलना के रूप में उत्पन्न किया जाना चाहिए। –

+0

क्षमा करें, मेरा कहना है कि क्या आप * डी * कंपाइलर का प्रस्ताव दे रहे थे, जो गेटोस से बचने के पक्ष में होना चाहिए। जैसा कि आप इंगित करते हैं, यह मुद्दा नहीं है। – Brian

0

जब आप कोड डिकंपाइल, आप मूल कोड वापस पाने के लिए गारंटी नहीं है। जब आईएल में .NET कोड संकलित होता है, तो इसे अनुकूलित किया जाता है। कभी-कभी जब आप आईएल को वापस सी # में अनुवाद करते हैं तो आप कुछ पागल देखेंगे। इसका मतलब यह नहीं है कि कोड काम नहीं करता है, यह सिर्फ आईएल का अनुवाद करने के लिए आवेदन (इस मामले में resharper) है।

यदि आप इसके बारे में चिंतित हैं, तो मैं यह देखने के लिए सीधे आईएल पर देखता हूं कि इसे किस प्रकार संकलित किया गया था।

साइड नोट: सी # या वीबीनेट में आईसी को संकलित करने की गारंटी नहीं है। :)

एक अन्य उत्पाद की कोशिश करने का Reflector

+0

आज़माएं, मैं पहले से ही प्रतिबिंबक का उपयोग कर रहा हूं :) – Snake

+0

परावर्तक में निश्चित रूप से बहुत सारी बग शामिल हैं। मैंने खुद को बताया, और कभी भी जवाब नहीं मिला। Http: //www.red-gate .com/MessageBoard/viewtopic.php? t = 8858 –

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