2011-04-04 11 views
6

मैं इस बारे में कुछ समय से सोच रहा हूं, लेकिन मुझे एक निश्चित उत्तर नहीं मिल रहा है।प्रारूप के बिना Int32.ToString() का उपयोग और IFormatProvider। मुझे CA1305 चेतावनी क्यों मिलती है?

CA1305: जब भी मैं एक स्ट्रिंग ToString() विधि का उपयोग करने के लिए एक पूर्णांक कनवर्ट करते हैं, और मैं एक कोड विश्लेषण चलाने के लिए, मैं निम्नलिखित चेतावनी मिलती है Microsoft.Globalization: क्योंकि की व्यवहार 'int.ToString()' वर्तमान उपयोगकर्ता की लोकेल सेटिंग्स के आधार पर भिन्न हो सकता है, इस कॉल को 'class.Method()' में 'int.ToString (IFormatProvider)' पर कॉल के साथ बदलें। यदि 'int.ToString ( IFormatProvider) का परिणाम उपयोगकर्ता को प्रदर्शित किया जाएगा, तो ' CultureInfo.CurrentCulture 'को ' IFormatProvider 'पैरामीटर के रूप में निर्दिष्ट करें। अन्यथा, यदि परिणाम सॉफ़्टवेयर द्वारा संग्रहीत और एक्सेस किया जाएगा, जैसे जब यह डिस्क पर रहता है या डेटाबेस पर, 'CultureInfo.InvariantCulture' निर्दिष्ट करें।

यह बहुत अच्छी तरह से ज्ञात सामान्य CA1305 चेतावनी है, जो दिखाया जाता है जब भी आप एक विधि एक अधिभार है कि एक IFormatProvider पैरामीटर स्वीकार करता है कि करने के लिए एक फोन करना है। हालांकि यह लगभग सभी मामलों में एक बहुत ही सही चेतावनी है, लेकिन मैं किसी भी प्रारूप या प्रारूपप्रोवाइडर बिना पूर्णांक पर डिफ़ॉल्ट ToString()पर कॉल करते समय गलत हो सकता है। तो कृपया, अगर किसी को कुछ भी पता है जो गलत हो सकता है, तो मुझे प्रबुद्ध करें। मुझे लगता है कि IFormatProvider अधिभार के लिए एक अच्छा कारण होना चाहिए।

वैसे, हमेशा IFormatProvider ओवरलोड का उपयोग करके कॉल करें, क्योंकि ऐसा लगता है कि इसका प्रदर्शन लाभ भी है। अगर किसी के पास इस पर कोई अंतर्दृष्टिपूर्ण टिप्पणियां हैं, तो उन्हें भी साझा करने में संकोच न करें।

उत्तर

9

कुछ चीजें जो मैं कल्पना कर सकते हैं आसानी से परिणाम को प्रभावित कर सकते हैं:

  • चाहे अंक प्रतिस्थापित कर रहे हैं (यकीन नहीं अगर यह ToString प्रभावित करता है)
  • अंक वर्गीकृत किया है या नहीं (यकीन है कि अगर NumberFormatInfo नहीं होगा बस ToString कॉल की इस तरह)
  • ऋणात्मक चिह्न से एक पूर्णांक में कभी समूह अंक (यह आसानी से महत्वपूर्ण हो सकता है)

यह चीजों को कैसे प्रभावित कर सकता है, NegativeSign संपत्ति का उपयोग कर के लघु लेकिन पूर्ण उदाहरण:

using System; 
using System.Globalization; 
using System.Threading; 

class Test 
{ 
    static void Main() 
    { 
     int x = -10; 
     Console.WriteLine(x.ToString()); 

     CultureInfo culture = Thread.CurrentThread.CurrentCulture; 
     // Make a writable clone 
     culture = (CultureInfo) culture.Clone(); 
     culture.NumberFormat.NegativeSign = "!!!"; 

     Thread.CurrentThread.CurrentCulture = culture; 
     Console.WriteLine(x.ToString()); 
    } 
} 

आउटपुट:

-10 
!!!10 
+0

बहुत स्पष्ट उदाहरण है, धन्यवाद। मुझे पता नहीं था कि नकारात्मक संस्कृति प्रति संस्कृति भिन्न हो सकती है। –

3

आप NumberFormatInfo Class पर एक नज़र डालें, तो आप यह है कि कुछ गुण देखेंगे उदाहरण के लिए PositiveSign या समूह सेपरेटर्स जैसे पूर्णांक पर लागू करें।

3

भले ही प्रारूप वास्तव में संस्कृतियों के बीच भिन्न न हो, फिर भी आपको चेतावनी मिलती है कि आप वास्तव में संस्कृति की जानकारी का उपयोग करके एक कॉल कर रहे हैं, ऐसा लगता है कि इसमें कोई संस्कृति जानकारी नहीं है।चेतावनी इतनी चिंतित नहीं है कि क्या संस्कृति की जानकारी कोई फर्क पड़ती है, बल्कि कोड उस जानकारी को छुपाता है जिस पर संस्कृति की जानकारी का उपयोग किया जाता है।

ToString पर पैरामीटर रहित कॉल बदले में ToString(CultureInfo.CurrentCulture) पर कॉल करेगा। पैरामीटर रहित कॉल इस जानकारी को छुपाता है, इसलिए आपको कॉल करना चाहिए जहां आप दिखाते हैं कि कौन सी संस्कृति जानकारी है कि आप कॉल में उपयोग करना चाहते हैं।

+0

मैं छिपाने के बारे में आपके तर्क पर सहमत हूं, हालांकि मुझे अभी भी लगता है कि चेतावनी संस्कृति अंतर के बारे में है: 'क्योंकि int.oString()' का व्यवहार वर्तमान उपयोगकर्ता की लोकेल सेटिंग्स के आधार पर भिन्न हो सकता है ... ' –

+1

@ रिवाइंडर: तथ्य यह है कि सेटिंग्स की वजह से परिणाम भिन्न नहीं है, यह तब भी होगा जब आप 'CultureInfo.CurrentCulture' निर्दिष्ट करते हैं, यह है कि संस्कृति का उपयोग छुपा हुआ है यह मुद्दा है। – Guffa

0

कुछ चीजें जो मैं कल्पना कर सकते हैं आसानी से परिणाम को प्रभावित कर सकते हैं:

  • चाहे अंक प्रतिस्थापित कर रहे हैं (यकीन नहीं अगर यह ToString प्रभावित करता है)

  • अंक वर्गीकृत किया है या नहीं (यकीन है कि अगर NumberFormatInfo नहीं कभी भी
    समूह अंकों को केवल इस प्रकार के ToString कॉल से पूर्णांक में)

  • ऋणात्मक चिह्न (यह आसानी से महत्वपूर्ण हो सकता है)

    using System; 
        using System.Globalization; 
        using System.Threading; 
    
        class Test 
        { 
        static void Main() 
        { 
         int x = -10; 
         Console.WriteLine(x.ToString()); 
    
         CultureInfo culture = Thread.CurrentThread.CurrentCulture; 
        // Make a writable clone 
         culture = (CultureInfo) culture.Clone(); 
        culture.NumberFormat.NegativeSign = "!!!"; 
    
        Thread.CurrentThread.CurrentCulture = culture; 
        Console.WriteLine(x.ToString()); 
        } 
        } 
    
संबंधित मुद्दे

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