2011-03-15 25 views
7

उदाहरण के लिए, अगर मैं एक विधि के रूप में परिभाषित किया गया है ...क्या यह सुनिश्चित करने के लिए कोई तरीका है कि टी शून्य नहीं है?

T Create() 
{ 
    T t = Factory.Create<T>(); 

    // ... 

    Assert.IsNotNull(t, "Some message."); 
    // -or- 
    if (t == null) throw new Exception("..."); 
    // -or- anything that verifies that it is not null 
} 

... और मुझे कहीं और से है कि विधि बोल रहा हूँ ...

void SomewhereElse() 
{ 
    T t = Create(); 
    // >><< 
} 

... >><< पर, मुझे पता है (मेरा मतलब है, वह व्यक्ति जिसने इसे लिखा है) कि t शून्य होने की गारंटी नहीं है। क्या कोई तरीका है (एक विशेषता, शायद, जो मुझे नहीं मिली है) एक विधि को चिह्नित करने के लिए यह सुनिश्चित करने के लिए कि एक संदर्भ प्रकार जो यह लौटाता है या अन्यथा पास हो जाता है (शायद out पैरामीटर) आंतरिक तर्क द्वारा शून्य नहीं होने की गारंटी है?

मुझे भेड़-बकरियों से यह मानना ​​है कि रीशेर्पर अधिकतर क्यों है क्योंकि मुझे लगता है कि यह किसी भी चीज को हाइलाइट करता है जो InvalidOperationException या NullReferenceException का कारण बन सकता है। मुझे लगता है कि यह कुछ ऐसा पढ़ रहा है जिसे मैं अपने तरीकों पर चिह्नित कर सकता हूं या यह जानता है कि Assert.IsNotNull, सरल बूलियन चेक या कुछ अन्य चीजें कुछ शून्य होने का मौका हटा देती हैं और यह हाइलाइट को हटा सकती है।

किसी भी विचार? क्या मैं सिर्फ ओह-ई-ईश्वर-रिशेर्पर-हाइलाइट्स का शिकार हो रहा हूं-यह-मुझे-ठीक-ठीक-ठीक है?

+0

मैं भी से ग्रस्त ओह-मेरी-देवता-ReSharper-प्रकाश डाला यह मैं-है-हैं- में वर्णित उनके [NotNull] विशेषता के साथ Factory.Create<T>() विधि चिह्नित कर सकते हैं ठीक है यह बीमारी। तो आप अकेले नहीं हैं। –

उत्तर

4

तो ReSharper कारण है कि आप तो परवाह आप अपने web help

+0

मुझे लगता है कि मैं उनकी वेब सहायता से डरता हूं। यही वह है जिसकी तलाश में मैं हूं। अब मुझे इस तथ्य का सामना करना पड़ेगा कि मुझे कभी भी हमारे आवेदन में रिशेर्पर असेंबली का संदर्भ नहीं मिल रहा है :)। धन्यवाद! – Shibumi

+0

@Shibumi - वे वास्तव में दिखाते हैं कि कैसे अपने कोड में परिभाषाओं को काटकर चिपकाकर अपने असेंबली को संदर्भित करना है। यह एक ही लिंक में है। –

+0

मैं वास्तव में उसमें संशोधन करने के लिए वापस आ रहा था। मुझे लगता है कि वे नामस्थान की उपस्थिति और अपने कोड में विशेषताओं का पता लगा सकते हैं। मुझे लगता है कि मुझे अभी भी उस पर एक कठिन बिक्री होगी, हालांकि: "मैं इन अपर्याप्त विशेषताओं को हमारे कोडबेस में जोड़ना चाहता हूं ताकि मेरी ओसीडी स्क्विग्ली लाइनों को हटाने के लिए संतुष्ट हो।" यद्यपि कि आपकी इस सहायता के लिए धन्यवाद; आप जिस जवाब की तलाश में थे, उस पर आप शून्य हो गए! – Shibumi

1

तरीका नहीं जानते आर # इस संभालती है, लेकिन Contract.Assert विधि आपके लिए

0

आप एक वस्तु के लिए टी डाली जा सकी जो खोज रहे हैं तो अगर इसकी अशक्त जाँच हो सकता है?

var o = (object)Factory.Create<T>(); 
if(o == null) throw new Exception(); 
1

आप टी पर एक बाधा डाल केवल struct अनुमति देने के लिए कर सकता है।

आप SpecSharp, या Code Contracts की तरह, अपने समारोह (अनुबंध आधारित प्रोग्रामिंग) के लिए पूर्व/पोस्ट की स्थिति का मजबूत परिभाषाओं करने की अनुमति देता है कि एक भाषा एक्सटेंशन का उपयोग कर सकते हैं। कोड अनुबंध सी # 4.0 से निर्मित सिस्टम का लाभ उठाने लगता है। मुझे उनके साथ कोई अनुभव नहीं है - केवल उनके बारे में सुना है।

+0

समस्या यह है कि ReSharper पहचानने वाला कुछ होना चाहिए। – Shibumi

+0

@Shibumi: यदि आप समस्या को हल करने के लिए सुझाए गए तरीकों में से एक का उपयोग करते हैं (जो अपना स्वतंत्र सत्यापन देगा, और संकलन समय पर इसकी गारंटी दे सकता है, तो आपके रनटाइम चेक से कोड को राहत दे सकता है), आपको निश्चित रूप से कॉन्फ़िगरेशन/प्रागम्स जोड़ना चाहिए उन्हें अनदेखा करने के लिए ReSharper कॉन्फ़िगर करें। यह सही दस्तावेज़ों की तरह दिखता है: http://www.jetbrains.com/resharper/webhelp/Code_Analysis__Solution-Wide_Analysis__Configuring_Solution-Wide_Analysis.html। आपको हमेशा किसी भी स्थिर विश्लेषण उपकरण से अपनी चेतावनियों की जांच और कस्टमाइज़ करना चाहिए। –

+0

@Shibumi: लेकिन आप अपने लिए सबसे अच्छा समाधान चुनने के लिए स्वतंत्र हैं :) समस्या पर अधिक तकनीक फेंकने से पहले आपके पास पहले से मौजूद उपकरणों का पूरी तरह से उपयोग करना बेहतर होता है। माइक दो का जवाब एक अच्छा लगता है। –

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