मैं Code Contracts का उपयोग Code Contracts Editor Extensions वीएस -2010 ऐड-इन के साथ कर रहा हूं। मेरे पास एक कक्षा है जो IEnumerable<T>
इंटरफ़ेस लागू करती है, और मैंने GetEnumerator()
विधि के लिए एक इटरेटर ब्लॉक लागू किया है। यह ऊपर, मैं निम्नलिखित विरासत में मिला अनुबंध देख सकते हैं:कोड अनुबंध: IENumerator <T> .GetEnumerator() अजीब विरासत अनुबंध?
मैं पहले और तीसरे अनुबंध आवश्यकता को समझते हैं - GetEnumerator()
एक अशक्त वापस कभी नहीं करना चाहिए, और यह एक पक्ष प्रभाव का कारण नहीं करना चाहिए। लेकिन दूसरी अनुबंध आवश्यकता का क्या अर्थ है? यह Model
IEnumerator<T>
और IEnumerable
की संपत्ति क्या है?
संपादित करें: Damien_The_Unbeliever के रूप में उसकी टिप्पणी में बताया, IEnumerable<T>
और IEnumerator<T>
के लिए अनुबंध, एक संविदा संदर्भ विधानसभा एक अलग फ़ाइल में स्थित हैं। वहाँ GetEnumerator()
में एक अतिरिक्त अनुबंध है कि संपादक द्वारा प्रदर्शित नहीं किया जाता है
[return: Fresh]
[Escapes(true, false), Pure, GlobalAccess(false)]
public IEnumerator GetEnumerator()
{
IEnumerator enumerator;
Contract.Ensures((bool) (Contract.Result<IEnumerator>() != null), null, "Contract.Result<IEnumerator>() != null");
Contract.Ensures((bool) (Contract.Result<IEnumerator>().Model == this.Model), null, "Contract.Result<IEnumerator>().Model == this.Model");
Contract.Ensures((bool) (Contract.Result<IEnumerator>().CurrentIndex == -1), null, "Contract.Result<IEnumerator>().CurrentIndex == -1");
return enumerator;
}
दिलचस्प बात यह है: Reflector का उपयोग करना (पूर्ण कोड here है) उन दो इंटरफेस के अनुबंध के disassembly में,, आप निम्न देख सकते हैं विस्तार:
Contract.Result<IEnumerator>().CurrentIndex == -1
और कुछ additionaly रहस्यों (जैसे Fresh
, Escapes
और GlobalAccess
विशेषताओं के रूप में)।
मैं आपकी मदद नहीं कर सकता, लेकिन मुझे रुचि के कुछ क्षेत्रों की ओर इशारा करने के लिए धन्यवाद। कोड अनुबंध द्वारा उपयोग किए जाने वाले 'IENumerable' और 'IENumerable' प्रकार C: \ Program Files \ Microsoft \ Contracts \ Contracts \ .NETFramework \ v4.0 \ mscorlib.Contracts.dll (स्थान भिन्न हो सकते हैं) से लोड किए गए हैं, और इन संस्करणों इंटरफेस (और उनके संबंधित अनुबंध वर्गों) में mscorlib से "वास्तविक" इंटरफेस की तुलना में अधिक सदस्य हैं। लेकिन अनुबंध एनोटेशन के माध्यम से भी पढ़ा है, मुझे नहीं पता कि मॉडल का उद्देश्य क्या है। –
@ डेमियन: धन्यवाद, मैंने आपकी नई जानकारी के प्रति प्रश्न संपादित किया है। –
क्या वह 'IENumerator' रिटर्न प्रकार अनुबंध में असली' IENumerator' इंटरफ़ेस या एक ही नाम वाला वर्ग है? यदि यह इंटरफ़ेस है तो मुझे यह भी समझ में नहीं आता कि यह क्यों संकलित करता है। – CodesInChaos