क्या .NET में स्वचालित रूप से लागू गुणों पर अनुबंध डालने का कोई तरीका है? (और अगर उत्तर 'हां' है तो कैसे?स्वत: लागू गुणों पर कोड अनुबंध
उत्तर
धन्यवाद पोर्गेस।
मेरे गलती है कि मैं वास्तव ReleaseRequires
विकल्प का इस्तेमाल किया था जो, वास्तव में, केवल सौदों के साथ विधि, Requires<T>
की सामान्य संस्करण।
अपरिवर्तनीय जो एक स्वत: लागू किया संपत्ति पर डाल दिया जाता है वास्तव में एकRequires
पूर्व शर्त में बदल गया है, लेकिन यह सामान्य नहीं है - यही कारण है कि यह इस विकल्प का उपयोग काम नहीं किया है।
क्या करें:
VARIANT 1. कोड के टुकड़े और सुंदर
Requires<T>
ऑटो कार्यान्वित गुण के बजाय उपयोग करने पर विचार - इच्छित प्रकार की अपवाद का उपयोग करने के लिए सक्षम बनाता है कि।VARIANT 2. बदलें कोड संविदा 'विकल्प में विकल्प
ReleaseRequires
Preconditions
करने और ऑटो गुणों पर अपरिवर्तनशीलताओं लिखने के लिए स्वतंत्र लग रहा है - rewriter उपकरण स्वतः उन्हेंRequires
में बदल जाएगा। हालांकि, वे गैर-सामान्य होंगे - इसका मतलब है कि अनुबंध टूटने के मामले में,ContractException
फेंक दिया जाएगा और इस व्यवहार को बदलने का कोई तरीका नहीं है।
मदद के लिए सभी को धन्यवाद!
(मैं DevLabs से नेट कोड ठेके का उपयोग कर यह मानें कि) मैं नहीं सोच रहा हूँ, लेकिन आप आसानी से एक टुकड़ा है कि इस करना होगा लिख सकते हैं। यदि आप इस मार्ग पर जाते हैं, here is a free snippet editor जो कार्य को बहुत आसान बना देगा।
हाँ, यह संभव है - की आवश्यकता होती है अपने वर्ग है, जो तब स्वत: set
Ter के बराबर Requires
पूर्व शर्त कहते हैं में [ContractInvariantMethod]
विधि करने के लिए अपने अनुबंध शर्त जोड़ने के लिए है, और एक के बाद हालत Ensures
में जोड़ा जाता है get
। Reference
उदाहरण दिखाता है के रूप में की धारा 2.3.1 से, ऑटो-संपत्तियों पर अपरिवर्तनशीलताओं में बदल जाते हैं:
- सेटर के लिए एक पूर्व शर्त
- गेटर के लिए एक postcondition
- एक अंतर्निहित बैकिंग फ़ील्ड के लिए 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);
...
यह कमाल है! – flakes
आप इस उद्देश्य के लिए वर्ग invarients उपयोग करने की कोशिश की है?मुझे संदेह है कि काम करेगा, जब तक ऑटो-प्रोप सेटर पर लौटने पर इनवेंटर्स की जांच नहीं की जाती है। (मैं अभी तक कोड अनुबंधों के साथ वीएस का संस्करण नहीं चला रहा हूं, इसलिए मैं इसे स्वयं परीक्षण नहीं कर सकता। मुझे नहीं पता कि मुझे कभी भी स्थिर चेकर के साथ एक संस्करण मिलेगा। :-() –
मैं काफी नहीं हूं सुनिश्चित करें कि इनवेंटर्स को प्रोजेक्ट के रिलीज़ संस्करण में चेक किया जाएगा, क्योंकि इस कॉन्फ़िगरेशन के लिए मैंने "केवल सार्वजनिक सतह अनुबंध" विकल्प चालू कर दिया है, जिसे मुझे केवल अनुबंध के साथ सौदा करने का संदेह है। सार्वजनिक तरीकों में इसकी आवश्यकता होती है। अगर मैं गलत हूं तो खुश रहें। – wh1t3cat1k
लेकिन मुझे डर है कि मैं सही हूं: "... आप डेटा अखंडता (धारा 2.3) को लागू करने के लिए इनवेरिएंट विधियों को जोड़ सकते हैं ... ये चेक आपके परीक्षण में रनटाइम के साथ लागू होते हैं जांच सक्षम है, लेकिन आपके शिपिंग कोड से गायब हो जाता है। " – wh1t3cat1k