2009-01-27 13 views
8

में कभी भी शून्य (अनुबंध द्वारा डिज़ाइन) वापस नहीं आती है मेरे पास एक ऐसी विधि है जो कभी भी शून्य वस्तु नहीं लौटाती है।मैं कैसे दिखा सकता हूं कि एक विधि सी #

if(Getxyz() != null) 
{ 
    // do stuff 
} 

मैं इस आशय कैसे दिखा सकते हैं: मैं इस तरह कोड लिखने के लिए यह स्पष्ट करने के लिए इतना है कि मेरी एपीआई के उपयोगकर्ताओं की जरूरत नहीं है करना चाहते हैं?

+0

इसके अलावा, यह जानने का कोई तरीका नहीं है कि आप पहले स्थान पर एक गैर-शून्य वस्तु वापस कर सकते हैं (जब तक कि यह एक संरचना न हो) हो सकता है कि आप एक संरचना वापस करना चाहते हैं? – Trap

उत्तर

10

Unforutnately कोई रास्ता सी #

आप इस तथ्य दस्तावेज़ कर सकते हैं करने के लिए बनाया है, लेकिन यह स्वचालित रूप से जांच नहीं की जाएगी।

यदि आप रिशेर्पर का उपयोग कर रहे हैं, तो विधि को [NotNull] विशेषता के साथ चिह्नित होने पर इसे ठीक से जांचने के लिए सेट किया जा सकता है।

अन्यथा आप Microsoft Contracts लाइब्रेरी का उपयोग कर सकते हैं और अपनी विधि के अनुसार निम्न के जैसा कुछ जोड़ सकते हैं, लेकिन यह इतनी सरल एनोटेशन के लिए बहुत अधिक अतिरिक्त शब्द है।

Contract.Ensures(Contract.Result<string>() != null) 

स्पेक # इस समस्या को हल करके हल किया! प्रकार के बाद, एक गैर-शून्य प्रकार के रूप में चिह्नित करने के लिए जैसे

string! foo 

लेकिन युक्ति # केवल .NET2 लक्षित करने के लिए इस्तेमाल किया जा सकता है, और द्वारा कोड पुस्तकालय संविदा छीन ली गई है।

+0

उह, लेकिन यह गलत है ... आप गारंटी दे सकते हैं कि एक विधि शून्य वापस नहीं आती है। अन्य उत्तरों में से कोई भी देखें ... –

+1

यदि आप एक गैर-शून्य स्ट्रिंग को वापस करना चाहते हैं तो संरचना का उपयोग करने में सहायता नहीं होती है। आप एक स्ट्रिंग युक्त नॉन-नल स्ट्रक्चर वापस कर सकते हैं जो शून्य हो सकता है, लेकिन यह कैसे बेहतर है? –

+0

सिंटैक्स आपके अनुबंध उदाहरण पर गलत है। 'परिणाम' एक विधि कॉल होना चाहिए: 'अनुबंध। परिणाम ()' – porges

6

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

0

यदि आपके उपयोगकर्ताओं के पास अनुबंध API द्वारा मानक डिज़ाइन का उपयोग करके आपका स्रोत कोड है: http://www.codeproject.com/KB/cs/designbycontract.aspx चीजों को स्पष्ट कर सकता है।

अन्यथा आपकी सर्वश्रेष्ठ शर्त दस्तावेज़ीकरण के माध्यम से है।

0

या तो इसे अच्छी तरह से दस्तावेज करें (शायद .NET मानक दस्तावेज़ीकरण प्रणाली के साथ) या आपको कुछ अनुबंध API का उपयोग करना होगा। यहाँ कुछ कर रहे हैं: http://geekswithblogs.net/Podwysocki/archive/2008/01/22/118770.aspx http://www.codeproject.com/KB/cs/designbycontract.aspx

0

आप एक Debug.Assert() विधि शामिल कर सकते हैं। हालांकि यह निश्चित रूप से इस शर्त को लागू नहीं करेगा, इसे स्पष्ट करना चाहिए (दस्तावेज़ीकरण के साथ) कि एक शून्य मान स्वीकार्य नहीं है।

2

मुझे नहीं पता कि एपीआई से ऐसा करने का सबसे अच्छा अभ्यास है क्योंकि मैं अभी भी रक्षात्मक रूप से प्रोग्राम करता हूं और उपभोक्ता के रूप में शून्य की जांच करता हूं। मुझे लगता है कि यह अभी भी इस मामले में सबसे अच्छा अभ्यास है क्योंकि मैं हमेशा सही काम करने के लिए अन्य कोड पर भरोसा नहीं करना चाहता हूं।

0

इसे दस्तावेज़ और स्रोत कोड प्रदान करें।

1

मुझे इसके बारे में अन्य तरीकों से सोचना पसंद है: यदि मेरा फ़ंक्शन एक शून्य मान वापस कर सकता है तो मैं बेहतर ढंग से सुनिश्चित करता हूं कि फ़ंक्शन के उपयोगकर्ता इसके बारे में जानते हैं।

2

यह सुनिश्चित करने के लिए एकमात्र टाइप-चेक तरीका है कि एक सी # ऑब्जेक्ट कभी भी शून्य नहीं लौटाता है, एक संरचना का उपयोग करना है। स्ट्रक्चर में ऐसे सदस्य हो सकते हैं जिनमें शून्य मान हों, लेकिन कभी भी खुद को शून्य नहीं कर सकते।

अन्य सभी सी # ऑब्जेक्ट्स शून्य हो सकते हैं।

उदाहरण कोड:

public struct StructExample 
{ 
    public string Val; 
} 

public class MyClass 
{ 
    private StructExamle example; 

    public MyClass() 
    { 
     example = null; // will give you a 'Cannot convert to null error 
    } 

    public StructExample GetXyz() 
    { 
     return null; // also gives the same error 
    } 
} 

ऊपर के उदाहरण संकलन नहीं होंगे। यदि एक संरचना का उपयोग स्वीकार्य है (यह एक मूल्य प्रकार बन जाता है, स्टैक पर चारों ओर पारित हो जाता है, उपclassed नहीं किया जा सकता है) तो यह आपके लिए काम कर सकता है।

+0

ध्यान दें कि डिफ़ॉल्ट रूप से stru * * मान द्वारा * पास करते हैं, जबकि कक्षाएं डिफ़ॉल्ट रूप से * रेफरी * द्वारा पास होती हैं। अंतर यह है कि संरचना के * सामग्री * को गुजरने पर ढेर पर डंप किया जाता है, जबकि वर्गों के लिए केवल एक * संदर्भ * स्टैक पर गिरा दिया जाता है, जिससे आप एक नई प्रतिलिपि के बजाय मूल वस्तु से बातचीत कर सकते हैं। इसे "रेफरी" कीवर्ड का उपयोग करके ओवरराइड किया जा सकता है, लेकिन फिर आपको 1) इसे हर जगह इस्तेमाल करना याद रखना होगा जिसे आप प्रतिलिपि नहीं चाहते हैं, और 2) यह फिर से शून्य हो सकता है, जो आप कोशिश कर रहे थे पहली जगह से बचें। – Thought

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