2009-08-20 13 views
17

मैं आज कुछ कोड लिख रहा था और मुझे उम्मीद थी कि कुछ काम नहीं कर रहा था।ओवरराइडिंग सी # सशर्त बयान समस्या

निम्न कोड निष्पादित क्यों करता है भले ही स्थिति को गलत तरीके से मूल्यांकन किया जाना चाहिए?

alt text http://img215.imageshack.us/img215/3011/agfewrf.gif

मैं दो शर्तों के आसपास ब्रेसिज़ डाल, और उनकी स्थिति स्विच करने की कोशिश की है, लेकिन EndedUsingApplication भी अभी भी निष्पादित करता है।

संपादित करें:

इसका कोई मतलब नहीं है || या & & ऑपरेटरों। यह देखो,

alt text http://img20.imageshack.us/img20/6655/aaaaaal.gif

कोई भी अपनी गलती से सीख सकते हैं जब तक कि मैं अपराधी कोड पोस्ट ... इसलिए ये रहा।

public static bool operator ==(ActiveApplication a, ActiveApplication b) 
    { 
    if ((object)a == null || (object)b == null) 
     return false; 
    return a.process_name == b.process_name && a.window_title == b.window_title; 
    } 

    public static bool operator !=(ActiveApplication a, ActiveApplication b) 
    { 
    return a == b ? false : true; 
    } 

और यहाँ काम कर कोड

public static bool operator ==(ActiveApplication a, ActiveApplication b) 
    { 
    // Casting to object class prevents this comparison operator being executed 
    // again and causing an infinite loop (which I think .NET detects and stops 
    // but it would still be a huge hole in the logic. 
    if ((object)a == null && (object)b == null) 
     return true; 
    if ((object)a == null^(object)b == null) 
     return false; 
    return a.process_name == b.process_name && a.window_title == b.window_title; 
    } 

    public static bool operator !=(ActiveApplication a, ActiveApplication b) 
    { 
    return a == b ? false : true; 
    } 

समस्या होने के कारण जब! = ऑपरेटर दो शून्य मान प्राप्त है ...।

+0

आप पोस्ट कर सकते हैं कि कोड? – danish

+0

@ जे रिग्स: बिंगो! हाँ यह मेरे पास है। वहां कुछ बुरा तर्क है जो गलत परिणाम लौटा रहा है। एक उचित उत्तर लिखें और शायद मैं इसे उत्तर के रूप में चिह्नित करूंगा;) – Nippysaurus

+0

@ निप्पी - एक उत्तर के रूप में जोड़ें! धन्यवाद! –

उत्तर

51

क्या आपने != अधिभारित किया है?

+0

स्पष्टीकरण के लिए मूल प्रश्न देखें। – Nippysaurus

+0

वाह, महान कॉल। –

+0

मुझे लगता है कि यहां –

3

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

1

क्या आपका प्रोग्राम बहु थ्रेड है?

मैंने ऐसी परिस्थितियों को देखा है जहां मैं एक मूल्य की जांच करता हूं और फिर इसे बदलने के लिए इसका उपयोग करने का प्रयास करता हूं। क्या हुआ यह है कि मैंने जांच के बाद मूल्य को बदल दिया, लेकिन इससे पहले कि मैंने इसका इस्तेमाल किया।

1

क्या आप निश्चित हैं कि आप वास्तव में उस पंक्ति पर हैं जिस पर आपने हाइलाइट किया है? आप कॉल स्टैक विंडो में चारों ओर क्लिक कर सकते हैं और कॉल के किसी हिस्से को "वर्तमान" रेखा को इस अर्थ में ढेर कर सकते हैं कि आप वहां चर के मूल्य प्राप्त कर सकते हैं।

बिंदु से किया जा रहा है, शायद EndedUsingApplication ActiveApplication सेट शून्य पर, ताकि ActiveApplication अशक्त जब यह करता है, तो मूल्यांकन नहीं था, लेकिन अब यह शून्य है जब आप डीबगर में यह मूल्यांकन कर रहे हैं।

क्या आपने एंडेड यूजिंग एप्लिकेशन (एक्टिव एप्प्लिकेशन) लाइन पर ब्रेकपॉइंट लगाया है ताकि यह सुनिश्चित किया जा सके कि सक्रिय लाइन उस लाइन को निष्पादित करने से पहले शून्य हो?

1

मुझे लगता है कि एक बेहतर दृष्टिकोण के रूप में इसे और अधिक स्पष्ट है Object.ReferenceEquals उपयोग करने के लिए है:

public static bool operator ==(ActiveApplication a, ActiveApplication b) 
    { 
    // same reference so equals is true - will be true for null == null 
    if (object.ReferenceEquals(a, b)) 
     return true; 

    // one is null and the other is not 
    if (object.ReferenceEquals(a, null) || object.ReferenceEquals(b, null)) 
     return false; 

    // dealt with all combinations of null - compare fields 
    return a.process_name == b.process_name && a.window_title == b.window_title; 
    } 

    public static bool operator !=(ActiveApplication a, ActiveApplication b) 
    { 
    return !(a == b); 
    } 
संबंधित मुद्दे