16

यह मेरा कोड है:क्या मैं इस सरल अनुबंध को गलत तरीके से कार्यान्वित कर रहा हूं?

public class RegularPolygon 
{ 
    public int VertexCount; 
    public double SideLength; 

    public RegularPolygon(int vertexCount, double sideLength) 
    { 
     Contract.Requires(vertexCount >= 3); 
     VertexCount = vertexCount; 
     SideLength = sideLength; 
    } 

    [ContractInvariantMethod] 
    private void RegularPolygonInvariants() 
    { 
     Contract.Invariant(VertexCount>=3); 
    } 

} 

मैं दोनों Contract.Requires और Contract.Invariant तरीकों से 2 से कम या बराबर बनने से vertexCount चर को रोकने के लिए के साथ की कोशिश की है; हालांकि मैं अभी भी 2 या कम पक्षों के साथ एक नियमित पोलिगॉन शुरू करने में सक्षम हूं। मेरा (सरलीकृत) NUnit परीक्षण इस तरह दिखता है:

[TestFixture] 
class TestRegularPolygon 
{ 
    private RegularPolygon _polygon; 

    [SetUp] 
    public void Init() 
    { 
     _polygon = new RegularPolygon(1, 50); 
    } 

    [Test] 
    public void Constructor() 
    { 
     Assert.That(_polygon.VertexCount,Is.GreaterThanOrEqualTo(3)); 
    } 

} 

उपर्युक्त परीक्षण भी पास हो जाता है और मैं यह नहीं समझ सकता कि क्यों!

सबसे पहले मैंने सोचा था कि ReSharper सकता है कुछ खिलवाड़ किया गया है क्योंकि यह लाइन और प्रदर्शित करता है इस संदेश को बाहर grays जब भी मैं Contract नाम स्थान में एक विधि का उपयोग करने का प्रयास करें:

विधि मंगलाचरण को छोड़ दिया है। कंपाइलर विधि आमंत्रण उत्पन्न नहीं करेगा क्योंकि विधि सशर्त है, या यह कार्यान्वयन के बिना आंशिक विधि है।

लेकिन आर # को निलंबित करना और एनयूनीट में परीक्षण चलाने के परिणामस्वरूप वीएस में कोई त्रुटि या चेतावनी नहीं है। तो मुझे लगता है कि ऐसा इसलिए है क्योंकि ReSharper में अभी तक कोड अनुबंधों के लिए हाइलाइटिंग संगतता नहीं है।

मैंने प्रलेखन को देखा है और जहां तक ​​मैं कह सकता हूं कि मुझे यह समस्या नहीं होनी चाहिए।

क्या मैं कोड अनुबंधों का गलत इस्तेमाल कर रहा हूं या क्या मेरा पर्यावरण किसी भी तरह से काम करने से रोक रहा है?

धन्यवाद।

उत्तर

18

जांच करने वाली पहली चीज़ - क्या आपको वास्तव में अनुबंध जांच चालू है? यदि नहीं, तो आपके कोई भी अनुबंध कुछ भी नहीं करेगा। इससे आर # चेतावनी भी समझाएगी। बिल्ड गुणों में "कोड अनुबंध" के अंतर्गत देखें, और देखें कि "रनटाइम चेकिंग" के तहत यह क्या कहता है।

टिप्पणियों के अनुसार, सुनिश्चित करें कि आपके पास संकलन प्रतीक के रूप में परिभाषित CONTRACTS_FULL है - ऐसा लगता है कि आर # की आवश्यकता है।

दूसरा बिंदु: आप सार्वजनिक परिवर्तनशील क्षेत्रों मिल गया है, अपने अपरिवर्तनीय कोई लेखन

polygon.VertexCount = 0; 

कृपया सार्वजनिक क्षेत्रों, विशेष रूप से नहीं लिखने योग्य लोगों का उपयोग नहीं करते द्वारा किसी भी क्षण में उल्लंघन किया जा सकता है, जिसका अर्थ है। :)

+0

क्या इनवेरिएंट विधि उसको पकड़ नहीं लेती? मैंने सोचा कि वे क्या हैं। उपर्युक्त मेरा पूरा कोड नहीं है, मेरी समस्या का प्रदर्शन करने के लिए सिर्फ एक उदाहरण है। यदि अनुबंध की जांच चालू करने का मतलब है कि आप प्रोजेक्ट गुणों पर जा रहे हैं> कोड अनुबंध> स्थिर जांच/पूर्ण रनटाइम जांच, हाँ वे अब चालू हैं (वे पहले नहीं थे) लेकिन मुझे अभी भी वही समस्या है। – Nobody

+0

@rmx: जब आप केवल फ़ील्ड बदलते हैं तो Invariant विधियां नहीं चलने वाली हैं। वे कैसे हो सकता है जब तक कॉलिंग कोड संशोधित नहीं किया जाता है, तब तक उनके लिए कोई कोड नहीं है। अब, "एक ही समस्या" होने के मामले में - क्या आपके पास * सभी * समान लक्षण हैं? क्या आर # अभी भी रेखा को बाहर कर रहा है? –

+0

ठीक है, इसे रद्द करें। मेरे पास यह काम कर रहा है मेरे Invariant तरीकों को भी निजी होने की जरूरत है। अभी भी आर # संदेश मिला है और लाइन को बाहर कर दिया गया है लेकिन यह अनुबंधों की कार्यक्षमता को प्रभावित नहीं कर रहा है।उम्मीद है कि वे अगली रिलीज में इसे ठीक करेंगे। – Nobody

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

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