2012-11-29 9 views
9

हमारे पास एक ऐसा प्रकार है जिसमें एक अंतर्निहित स्ट्रिंग ऑपरेटर है। यह इस तरह दिखता है:निहित ऑपरेटरों को शून्य को संभालना चाहिए?

public class Foo 
{ 
    readonly string _value; 

    Foo(string value) 
    { 
     _value = value; 
    } 

    public static implicit operator string(Foo foo) 
    { 
     return foo._value; 
    } 

    public static implicit operator Foo(string fooAsText) 
    { 
     return new Foo(fooAsText); 
    } 

} 

हम सिर्फ एक परिदृश्य में जहाँ उदाहरण अंतर्निहित ऑपरेटर के लिए पारित null था लिया है। जाहिर है, हम NullReferenceException के साथ समाप्त हो गए।

मैंने सोचा कि यह काफी उचित था, आखिरकार, एक प्रकार का स्ट्रिंग प्रस्तुति क्या है जो शून्य है - कहना मुश्किल है - इसलिए अपवाद वैध लग रहा था और कुछ हमें अवरोध/दबाने/संभाल/अनदेखा नहीं करना चाहिए। मेरा तर्क था कि किसी ने मुझे एक शून्य दिया है, मुझे वापस क्यों लौटना चाहिए। मैं इसे अन्य तरीकों से नहीं करता हूं। मैंने सोचा, 'मुझे पता है, मैं सिर्फ यह परिवर्तित करने से पहले अशक्त की जांच करेंगे', कुछ की तरह:

string s = foo == null ? null : foo;

लेकिन वह काम नहीं किया, क्योंकि यह अब है से पहले एक स्ट्रिंग में कनवर्ट करने शून्य की तुलना। बेशक, यह तुलना काम करेगी:

Foo f = null; 
string s; 
if (f != null) 
{ 
    s = f; 
} 

... लेकिन यह सिर्फ बदसूरत है।

मैं (सफारी पर एक 'रफ कटौती' पुस्तक) Essential C# 5 4th edition में खंड पढ़ सकते हैं और यह कहते हैं:

करते नहीं अंतर्निहित रूपांतरण से अपवाद फेंक देते हैं।

यह नहीं फेंक अपवाद करना कहते हैं, लेकिन यह पत्ते मुझे सोच रहा अपवादों को दबाने चाहिए?

public static implicit operator string(Foo foo) 
{ 
    return foo == null ? null : foo._value; 
} 

समस्या हल:

करने के लिए सबसे स्पष्ट बात विधि में कूद और करने के लिए इसे बदलने के लिए है। लेकिन मुझे गंदा लगता है। मुझे लगता है कि मैं शून्य के लिए जांच करके एक संभावित बग छुपा रहा हूँ। क्या मैं पागल/गुदा/बेवकूफ हूँ?

+1

यह सब आपके उपयोग के मामले पर निर्भर करता है। क्या आप चाहते हैं कि 'स्ट्रिंग' शून्य हो? –

+1

अच्छा बिंदु। आदर्श रूप में हम कभी भी 'फू' के शून्य उदाहरण में नहीं आना चाहते हैं। हमम ... शायद यह एक संरचना होनी चाहिए ... –

+2

@SteveDunn: एक महत्वपूर्ण बात: एक 'NullReferenceException' हमेशा उस कोड में एक बग इंगित करता है जो कोड को कॉल करने में अपवाद उठाता है, * नहीं *। तो बस 'null' के लिए' foo' की जांच नहीं कर रहा है ऑपरेटर में एक बग है। –

उत्तर

12

इस मामले में मैं क्या अनुशंसा करता हूं कि ऑपरेटर जो असफल हो सकता है, स्पष्ट रूप से स्पष्ट होना चाहिए। एक अंतर्निहित रूपांतरण का विचार यह है कि यह चौड़ा हो रहा है (यानी यह कभी असफल नहीं होगा।) दूसरी ओर, स्पष्ट रूपांतरणों को कभी-कभी असफल होने में सक्षम माना जाता है।

+1

दस्तावेज की सिफारिश भी यही है: http://msdn.microsoft.com/en-us/library/z5z9kes2.aspx –