अशक्त टोस्टरिंग ()


142

मुझे हर जगह निर्माण दिखाई देता है जैसे:

int? myVar = null;
string test = myVar.HasValue ? myVar.Value.ToString() : string.Empty;

क्यों नहीं बस का उपयोग करें:

string test = myVar.ToString();

क्या यह बिल्कुल वैसा ही नहीं है? कम से कम रिफ्लेक्टर कहता है कि:

public override string ToString()
{
  if (!this.HasValue)
  {
    return "";
  }
  return this.value.ToString();
}

तो, क्या यह सही है (छोटा संस्करण) या मुझे कुछ याद आ रहा है?


1
मैंने इस तरह का कोड नहीं देखा है :)
tymtam

जवाबों:


112

आप काफी सही हैं। इसके अलावा में इस सवाल का , पूर्व समाधान का सुझाव दिया है, जबकि कोई भी वास्तव में नोटिस किया जाता है ToString()पहले से ही सही जवाब देता है।

शायद अधिक क्रिया समाधान के लिए तर्क पठनीयता है: जब आप ToString()किसी ऐसी चीज पर कॉल करते हैं जो माना जाता है null, तो आप आमतौर पर एक की उम्मीद करते हैं NullReferenceException, हालांकि यहां इसे फेंका नहीं गया है।


21
दरअसल, कम से कम दो लोगों ने देखा: एरिक लिपर्ट और जोहान्स रोसेल।
जॉन स्कीट

7
हालांकि मुझे यकीन है कि आपका मतलब यह नहीं है, संदर्भ वास्तव में यहाँ अशक्त नहीं है। अशक्त <टी> एक मूल्य प्रकार है। यही कारण है कि कॉलिंग को ToString()बिना NullReferenceExceptionफेंके काम करता है ।
थोरारीन

2
यदि वह मानसिकता थी, तो आप .HasValueअभी भी उस अपवाद को फेंकने की अपेक्षा करेंगे।
एक्सट्रागोरेय

एक और कारण है कि लोग वर्बोज़ संस्करण का उपयोग अभिव्यक्ति के साथ समानता के लिए कर सकते हैं जैसे myNullableDateTime.HasValue ? myNullableDateTime.Value.ToString("d") : nullआपको वांछित ToStringपद्धति तक पहुंचने के लिए अपरिवर्तित ऑब्जेक्ट की आवश्यकता होती है। बेशक, उसके लिए एक और अधिक संक्षिप्त समाधान भी है:$"{myNullableDateTime:d}"
एक्सट्रागोरी

14

मुझे लगता है कि बहुत से लोगों के पास इस तरह की जाँच होती है क्योंकि यह किसी वस्तु का स्वाभाविक व्यवहार नहीं है जो अशक्त मूल्य धारण कर सकता है।


@ और सहमत हुए, क्योंकि लोग (मेरे जैसे) पहले सोचते हैं कि यह एक अपवाद फेंक देगा।
नाथन कोप

1
मुझे नहीं पता था कि यह व्यवहार था। मैंने निश्चित रूप से सोचा होगा कि कोई भी निर्माण जो (x == null) के लिए सही है, अगर आप x.ToString () भी कहते हैं, तो एक NullReferenceException को फेंक देगा।
दान ब्रायंट

5

नहीं, आप सही हैं, छोटा संस्करण वही है जो अन्य लोगों ने उस संबंध में किया है। अन्य निर्माण मैं नलिकाओं के साथ टर्नरी के बजाय एक बहुत उपयोग करने के लिए करते हैं, अशक्त सहवर्ती ऑपरेटर है। जो आपको नल से भी बचाता है। ToString () के लिए यह आवश्यक नहीं है (जैसा कि आपने बताया) लेकिन डिफ़ॉल्ट अंतर मानों के लिए (उदाहरण के लिए) यह अच्छी तरह से काम करता है, जैसे:

int page = currentPage ?? 1;

इससे आपको पृष्ठ w / o पर सभी पूर्णांक संचालन स्पष्ट रूप से null जाँचने और कॉल करने के लिए कर देता है currentPage (जहाँ currentPage एक int है? शायद एक परम के रूप में पारित किया गया है)


5

मुझे पता है, लंबे समय के बाद यह प्रासंगिक था, लेकिन ... मुझे संदेह है कि यह अंतर जैसे अशक्त प्रकारों के लिए है? .ToString () विधि आपको प्रारूप स्ट्रिंग्स का उपयोग करने की अनुमति नहीं देता है। देखें कि मैं ToString () के साथ एक अशक्त DateTime को कैसे प्रारूपित कर सकता हूं? । शायद मूल कोड में, .ToString () में एक प्रारूप स्ट्रिंग था, या शायद कोडर भूल गया था। प्रारूप स्ट्रिंग के बिना .TString () अभी भी अशक्त प्रकारों पर उपलब्ध था।


3

यह सिर्फ पैटर्न का पालन करने के लिए हो सकता है? या वे बैकएंड को नहीं जानते हैं। आप सही कोड समान हैं। आप भी कर सकते हैं:

int? i = null;
i.ToString(); //No NullReferenceException

यदि आपको ToString () को अपरिवर्तनीय संस्कृति का होना चाहिए, तो लंबा रास्ता अपनाना पड़ सकता है, क्योंकि nullables उनके मेनू में नहीं है।
13 Г И О И О

1

int?वाक्यविन्यास चीनी है जो अशक्त चर की घोषणा को सरल करता है। यह वैसा ही है Nullable<int>

इसलिए यदि आप ToString()विधि के कार्यान्वयन के लिए एक नज़र डालते हैं Nullable<T> (नीचे देखें) , तो आप देख सकते हैं, कि यदि कोई मूल्य नहीं है, तो यह खाली स्ट्रिंग लौटाता है।

public struct Nullable<T> where T : struct
{
    public override string ToString()
    {
      if (!this.hasValue)
        return "";
      return this.value.ToString();
    }
}

MSDN क्या कहता है:

Nullable.ToString विधि

यदि हैसवेल्यू संपत्ति सही है, या खाली स्ट्रिंग ("") है, तो हसावलू संपत्ति झूठी है, तो वर्तमान अशक्त वस्तु के मूल्य का पाठ प्रतिनिधित्व लौटाता है।

तो निम्न कोड फेंकने के बजाय कंसोल के लिए खाली स्ट्रिंग प्रिंट करेगा ArgumentNullException अपवाद ।

static void Main(string[] args)
{
    int? a = null;
    Console.WriteLine(a.ToString()); // Prints empty string to console.
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.