2011-12-04 10 views
6

नहीं बदलती है, मान लें कि मुझे अपनी ऑब्जेक्ट पर बूलियन IsValid संपत्ति मिली है।क्या यह सुनिश्चित करने के लिए कोड अनुबंध निर्दिष्ट करना संभव है कि विधि ऑब्जेक्ट की स्थिति

मैं एक विधि बनाना चाहता हूं, और यह सुनिश्चित करना चाहता हूं कि कॉल करने के बाद IsValid बदल नहीं है, चाहे यह कॉल से पहले सच या गलत था।

क्या ऐसी चीज के लिए कोई समर्थन है?

उत्तर

3

मैं इसे अपने आप प्रयास नहीं किया है, लेकिन according to the MSDNContract.OldValue जाँच करने के लिए है कि एक ही संपत्ति के मूल्य नहीं बदला है मदद कर सकता है:

public bool IsValid 
{ 
    get 
    { 
    ... 
    } 
} 

public void SomeMethod() 
{ 
    Contract.Ensures(this.IsValid == Contract.OldValue(this.IsValid)); 
    ... 
} 
+0

ग्रेट, धन्यवाद। यह काम करता हैं। –

1

नहीं, दुर्भाग्य से सी # एक कॉन्स लॉजिक प्रदान नहीं करता है जैसे सी ++ करता है।

1

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

5

उस उद्देश्य के लिए [शुद्ध] विशेषता System.Diagnostic.Contracts नेमस्पेस में जोड़ा गया है। आगे स्पष्टीकरण के लिए here देखें। हालांकि आप एक ही संपत्ति को बदलने से नहीं रोक सकते हैं। विधि को ऑब्जेक्ट स्थिति को बदलने की अनुमति नहीं है (जैसे सी ++ कॉन्स)।

संपादित करें: दुर्भाग्यवश शुद्ध विशेषता वर्तमान उपकरणों के साथ काम नहीं करती है। करने के लिए Pure चेकों के प्रलेखन 'भविष्य में' का समर्थन किया जाएगा के बारे में

public class Test 
{ 
    private int x = 0; 

    [Pure] 
    public void Foo() 
    { 
     x++; 
    } 
} 

: मैं एक परीक्षण निम्न कोड के साथ या तो स्थिर में है और न ही क्रम प्रकार की जाँच में कोई त्रुटि संदेश लागू किया,। जब भी वह ("कोड अनुबंध टीम उस पर भारी काम कर रही है, इस प्रकार भविष्य में रिलीज में एक शुद्धता परीक्षक के साथ आना।")।

मैं इस विश्वास का उपयोग कर रहा हूं कि यह सही तरीके से काम करता है। दस्तावेज कहता है कि अनुबंध के भीतर बुलाए गए सभी तरीकों को शुद्ध के रूप में घोषित किया जाना चाहिए। यह नहीं कहता कि यह चेक किया गया है या नहीं।

तो आपके प्रश्न का उत्तर यह है: इसके लिए कोई वर्तमान समर्थन नहीं है, लेकिन भविष्य में हो सकता है।

+4

मैं के बारे में एक ही बात का प्रस्ताव था, लेकिन MSDN जाँच का फैसला किया। एक बात मुझे चिंतित करती है: "यह विशेषता वर्तमान विश्लेषण उपकरण द्वारा लागू नहीं की जाती है; आपको केवल इस विशेषता का उपयोग करना चाहिए यदि आप सुनिश्चित हैं कि विधियां शुद्ध हैं।" http://msdn.microsoft.com/en-us/library/system.diagnostics.contracts.pureattribute.aspx पर। अगर यह कोई समस्या है या नहीं तो मैं एक त्वरित जांच करूँगा। – ViktorZ

+0

पुष्टि - PureAttribute कोड अनुबंध विश्लेषक में चेतावनी या त्रुटि उत्पन्न नहीं करता है जो ऑब्जेक्ट स्थिति को बदलने वाली विधि पर लागू होता है। रनटाइम और स्थिर जांच दोनों के साथ परीक्षण किया। तो इस परिदृश्य के लिए कोड अनुबंधों का उपयोग करने का कोई तरीका नहीं है – ViktorZ

+0

यह एक दिलचस्प बात है, मैंने इसकी भी पुष्टि की! तो माइक्रोसॉफ्ट एक विशेषता का उपयोग करता है और दस्तावेज करता है जो वास्तविक उपयोग नहीं है। यह बुरा है – slfan

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