2009-07-17 9 views
7

मैं यह निर्दिष्ट करने के बारे में कैसे जाऊं कि विधि के भीतर अपने स्वयं के अपवादों को डाले बिना मेरी विधि का एक विशेष पैरामीटर शून्य नहीं है?सी # विधि पैरामीटर निर्दिष्ट करना शून्य नहीं है

वहाँ कुछ

public void Foo (String myRequiredString nullable){ 

} 

उत्तर

1

में बनाया कुछ भी नहीं है की तरह है, लेकिन में (उदाहरण के लिए) LinFu कार्यान्वित के रूप में आप, "अनुबंध द्वारा डिजाइन" की अवधारणा को देखो सकता है।

+2

यह विजुअल स्टूडियो 2010 बीटा में सी # 4.0 में भी लागू किया गया है। –

+0

डीबीसी आपकी विधि में जांच करने से अलग कैसे है कि तर्क शून्य है या नहीं, और एक ArgumentNullException f.i को फेंक रहा है। जब तर्क शून्य है? –

+0

कार्यात्मक रूप से, यह वास्तव में नहीं है।संवैधानिक रूप से, हालांकि, यह उचित गुण के साथ इसे सजाने के द्वारा विधि के बाहरी इंटरफ़ेस से इरादा स्पष्ट करता है। –

3

आप मूल रूप से नहीं कर सकते हैं। आप शायद एओपी (जैसे कि PostSharp) का उपयोग कर सकते हैं ताकि आप इसमें से कुछ को विशेषताओं के माध्यम से या 4.0 में कोड-कॉन्ट्रैक्ट्स (संकलन-समय जांच की इजाजत दे सकें); लेकिन वहां "गैर-शून्य संदर्भ संदर्भ" नहीं है ("शून्य मूल्य-प्रकार" आदि की तुलना करने के लिए)। कम से कम नहीं: फ़ील्ड क्या शुरू करेंगे? और डिफ़ॉल्ट क्या होगा (...)?

मदद करने के लिए लैंगेज में कुछ शामिल करने का अनुरोध किया गया है (अनिवार्य रूप से आपके लिए शून्य जांच कर रहा है), लेकिन ऐसा नहीं हुआ है। कुछ ऐसा:

public void Foo (string! myRequiredString nullable) {...} 
1

सी # 4.0 में आप कोड अनुबंधों का उपयोग कर सकते हैं: InfoQ: .NET 4 Feature Focus: Code Contracts

इस समय अन्य सभी समाधानों में रनटाइम कोड चेक शामिल हैं। विधि में कोड इंजेक्ट करने के लिए आप PostSharp जैसे एओपी ढांचे का उपयोग कर सकते हैं, लेकिन यह सब विधि में कोड के लिए नीचे आता है।

+0

मैं अपने .NET 3.5/VS2008 कार्य के साथ कोड अनुबंध का उपयोग करता हूं: http://msdn.microsoft.com/en-us/devlabs/dd491992.aspx –

1

.NET के कुछ बीटा संस्करण में शामिल होने के अलावा ... जो, रोमांचक होने पर जोखिम भरा होता है और वास्तव में आपके प्रश्न का उत्तर नहीं देता है।

अब दुर्भाग्यवश सबसे अच्छी बात यह है कि आप अपने कोड पर इंटेलिसेंस टिप्पणियां जोड़ सकते हैं जो चेतावनी न देने की चेतावनी देते हैं।

/// <summary> 
    /// This Foo method does Bar to something. 
    /// </summary> 
    /// <param name="myRequiredString">required, do NOT pass nulls. I really really mean it!</param> 
    public void Foo(String myRequiredString) 
    { 
     if (myRequiredString == null) 
     { 
      throw new ArgumentNullException("myRequiredString", "It said required in the name of the argument, dummy!"); 
     } 
    } 

वहाँ बाहर कुछ hackish solutions जहां लोगों को एक सामान्य NonNullable struct को लागू किया है होते हैं, लेकिन लब्बोलुआब यह है कि आप क्या चाहते हैं के लिए दृश्य स्टूडियो "फू (शून्य)" आपके द्वारा लिखे जाने न जाने के लिए और चेतावनी देने के लिए है यदि आप करते हैं या आपको कुछ कंपाइलर त्रुटि देते हैं, और तथ्य 99.99% विधि कॉल के लिए है, जहां कुछ शून्य नहीं होना चाहिए, तो आपको == नल चेक करना होगा और किसी भी तरह से ArgumentNullException को फेंकना होगा, क्योंकि आप पता नहीं है कि रनटाइम तक तर्क शून्य है। यहां तक ​​कि अगर आप कम से कम सी # में खोज रहे थे तो संकलक को शून्य जांच जोड़नी होगी और वहां ArgumentNullException फेंकना होगा।

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

+0

.NET 4.0 से कोड अनुबंध लाइब्रेरी सार्वजनिक रूप से .NET 3.5 और VS2008 के लिए उपलब्ध है । http://msdn.microsoft.com/en-us/devlabs/dd491992.aspx –

0

मैं वर्तमान में इस विषय पर सी # में काम कर रहा हूं। .NET के मूल्य प्रकार के लिए Nullable < टी > है, लेकिन संदर्भ प्रकार के लिए व्यस्त सुविधा मौजूद नहीं है।

मैंने संदर्भ प्रकारों के लिए NotNullable < टी > बनाया, और डेटाटाइप डोमेन पर समस्या (यदि शून्य के लिए कोई और जांच नहीं) से समस्या को स्थानांतरित किया। हालांकि, यह एप्लिकेशन को रनटाइम में अपवाद फेंकने के लिए बनाता है, संकलन समय में नहीं, लेकिन यह अभी भी मेरे लिए बहुत उपयोगी है।

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