2011-04-01 18 views
13

क्या .NET में स्वचालित रूप से लागू गुणों पर अनुबंध डालने का कोई तरीका है? (और अगर उत्तर 'हां' है तो कैसे?स्वत: लागू गुणों पर कोड अनुबंध

+2

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

+0

मैं काफी नहीं हूं सुनिश्चित करें कि इनवेंटर्स को प्रोजेक्ट के रिलीज़ संस्करण में चेक किया जाएगा, क्योंकि इस कॉन्फ़िगरेशन के लिए मैंने "केवल सार्वजनिक सतह अनुबंध" विकल्प चालू कर दिया है, जिसे मुझे केवल अनुबंध के साथ सौदा करने का संदेह है। सार्वजनिक तरीकों में इसकी आवश्यकता होती है। अगर मैं गलत हूं तो खुश रहें। – wh1t3cat1k

+0

लेकिन मुझे डर है कि मैं सही हूं: "... आप डेटा अखंडता (धारा 2.3) को लागू करने के लिए इनवेरिएंट विधियों को जोड़ सकते हैं ... ये चेक आपके परीक्षण में रनटाइम के साथ लागू होते हैं जांच सक्षम है, लेकिन आपके शिपिंग कोड से गायब हो जाता है। " – wh1t3cat1k

उत्तर

1

धन्यवाद पोर्गेस।

मेरे गलती है कि मैं वास्तव ReleaseRequires विकल्प का इस्तेमाल किया था जो, वास्तव में, केवल सौदों के साथ विधि, Requires<T> की सामान्य संस्करण।

अपरिवर्तनीय जो एक स्वत: लागू किया संपत्ति पर डाल दिया जाता है वास्तव में एकRequires पूर्व शर्त में बदल गया है, लेकिन यह सामान्य नहीं है - यही कारण है कि यह इस विकल्प का उपयोग काम नहीं किया है।

क्या करें:

  • VARIANT 1. कोड के टुकड़े और सुंदर Requires<T> ऑटो कार्यान्वित गुण के बजाय उपयोग करने पर विचार - इच्छित प्रकार की अपवाद का उपयोग करने के लिए सक्षम बनाता है कि।

  • VARIANT 2. बदलें कोड संविदा 'विकल्प में विकल्पReleaseRequiresPreconditions करने और ऑटो गुणों पर अपरिवर्तनशीलताओं लिखने के लिए स्वतंत्र लग रहा है - rewriter उपकरण स्वतः उन्हें Requires में बदल जाएगा। हालांकि, वे गैर-सामान्य होंगे - इसका मतलब है कि अनुबंध टूटने के मामले में, ContractException फेंक दिया जाएगा और इस व्यवहार को बदलने का कोई तरीका नहीं है।

मदद के लिए सभी को धन्यवाद!

1

(मैं DevLabs से नेट कोड ठेके का उपयोग कर यह मानें कि) मैं नहीं सोच रहा हूँ, लेकिन आप आसानी से एक टुकड़ा है कि इस करना होगा लिख ​​सकते हैं। यदि आप इस मार्ग पर जाते हैं, here is a free snippet editor जो कार्य को बहुत आसान बना देगा।

16

हाँ, यह संभव है - की आवश्यकता होती है अपने वर्ग है, जो तब स्वत: set Ter के बराबर Requires पूर्व शर्त कहते हैं में [ContractInvariantMethod] विधि करने के लिए अपने अनुबंध शर्त जोड़ने के लिए है, और एक के बाद हालत Ensures में जोड़ा जाता है getReference

उदाहरण दिखाता है के रूप में की धारा 2.3.1 से, ऑटो-संपत्तियों पर अपरिवर्तनशीलताओं में बदल जाते हैं:

  1. सेटर के लिए एक पूर्व शर्त
  2. गेटर के लिए एक postcondition
  3. एक अंतर्निहित बैकिंग फ़ील्ड के लिए invariant

और द्वारा उदाहरण:

public int MyProperty { get; private set ;} 

[ContractInvariantMethod] 
private void ObjectInvariant() 
{ 
    Contract.Invariant (this.MyProperty >= 0); 
} 

"निम्न कोड के बराबर है:"

private int backingFieldForMyProperty; 
public int MyProperty 
{ 
    get 
    { 
    Contract.Ensures(Contract.Result<int>() >= 0); 
    return this.backingFieldForMyProperty; 
    } 

    private set 
    { 
    Contract.Requires(value >= 0); 
    this.backingFieldForMyProperty = value; 
    } 
} 

[ContractInvariantMethod] 
private void ObjectInvariant() 
{ 
    Contract.Invariant (this.backingFieldForMyProperty >= 0); 
... 
+0

यह कमाल है! – flakes

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