क्या .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
- 1. रनटाइम पर कोड अनुबंध
- 2. कोड अनुबंध और असीमितता
- 3. कोड अनुबंध सर्वोत्तम अभ्यास
- 4. [nonSerialized] स्वत: पूरक गुणों पर क्यों काम नहीं करता है?
- 5. स्वत: कार्यान्वित गुणों को ट्रैक करें
- 6. यूनिट परीक्षण कोड अनुबंध
- 7. Moq और कोड अनुबंध
- 8. कोड अनुबंध: IENumerator <T> .GetEnumerator() अजीब विरासत अनुबंध?
- 9. माइक्रोसॉफ्ट कोड अनुबंध और सीआई बिल्ड सर्वर
- 10. स्वत: जेनरेट कोड
- 11. कोड अनुबंधों में अनुबंध। फोरेल का उपयोग
- 12. कोड अनुबंध रिवाइट विफल - libpaths ऑर्डर
- 13. मैन्युअल कार्यान्वित गुणों पर ऑटो-लागू गुणों का उपयोग करने का कोई कारण?
- 14. कोड अनुबंध के साथ iterators में बग?
- 15. नेट कोड अनुबंध - और कहाँ सीखना है?
- 16. ऑटो-लागू गुण गुणों का समर्थन करते हैं?
- 17. अनुबंध। अनुबंध बनाम आवश्यक है।
- 18. स्वत: कार्यान्वित गुणों को धारावाहिक होने से कैसे रोकें?
- 19. दृश्य स्टूडियो में स्वत: पूर्ण गुणों के लिए शॉर्टकट?
- 20. स्वत: पूर्णता/कोड समापन/इंटेलिजेंस
- 21. कोड अनुबंध, कुल और कस्टम गणना
- 22. कोड अनुबंध, क्या आप उनका उपयोग करेंगे?
- 23. एक्सकोड कोड स्निपेट स्वत: पूर्ण
- 24. एकाधिक गुणों पर एक बार
- 25. .NET कोड अनुबंध: क्या इससे अधिक बुनियादी हो सकता है?
- 26. कस्टम उपयोगकर्ता नियंत्रण स्वत: -उत्पादित कोड
- 27. कोड अनुबंध और विरासत की समस्याएं, क्या चलती है?
- 28. रैकेट अनुबंध
- 29. एंड्रॉइड - वर्तमान में लागू कोड में कोड
- 30. गुणों पर गणना करना
आप इस उद्देश्य के लिए वर्ग invarients उपयोग करने की कोशिश की है?मुझे संदेह है कि काम करेगा, जब तक ऑटो-प्रोप सेटर पर लौटने पर इनवेंटर्स की जांच नहीं की जाती है। (मैं अभी तक कोड अनुबंधों के साथ वीएस का संस्करण नहीं चला रहा हूं, इसलिए मैं इसे स्वयं परीक्षण नहीं कर सकता। मुझे नहीं पता कि मुझे कभी भी स्थिर चेकर के साथ एक संस्करण मिलेगा। :-() –
मैं काफी नहीं हूं सुनिश्चित करें कि इनवेंटर्स को प्रोजेक्ट के रिलीज़ संस्करण में चेक किया जाएगा, क्योंकि इस कॉन्फ़िगरेशन के लिए मैंने "केवल सार्वजनिक सतह अनुबंध" विकल्प चालू कर दिया है, जिसे मुझे केवल अनुबंध के साथ सौदा करने का संदेह है। सार्वजनिक तरीकों में इसकी आवश्यकता होती है। अगर मैं गलत हूं तो खुश रहें। – wh1t3cat1k
लेकिन मुझे डर है कि मैं सही हूं: "... आप डेटा अखंडता (धारा 2.3) को लागू करने के लिए इनवेरिएंट विधियों को जोड़ सकते हैं ... ये चेक आपके परीक्षण में रनटाइम के साथ लागू होते हैं जांच सक्षम है, लेकिन आपके शिपिंग कोड से गायब हो जाता है। " – wh1t3cat1k