2008-10-04 9 views
10

वीबी 6 में वापस, मैंने कुछ फ़ंक्शंस लिखे जो मुझे नल और '' तारों के लिए अंतर, शून्य और संख्याओं के लिए 0) के बीच अंतर की देखभाल किए बिना कोड देने देगी। कुछ भी मेरी हत्या नहीं करता डेटा से निपटने के लिए विशेष केस कोड जोड़ने से कोडिंग करते समय उत्पादकता अधिक होती है जो कुछ अप्रासंगिक त्रुटि का कारण बन सकती है; 99 99/10000 यदि मैं किसी संख्या के रूप में उपयोग कर रहा हूं तो शून्य है, तो वास्तव में मैं इसे 0तारों से सुरक्षित रूपांतरण के लिए हेल्पर फ़ंक्शन

में अब मैं सी # में हूं, और वीबी 6 और सी # 2005 के बीच का अंतर काफी व्यापक है ... इसलिए मैं वास्तव में नहीं जानते कि मेरे नए सहायक कार्यों को कैसे लिखना शुरू करना है, या अगर मुझे उन्हें भी करने की ज़रूरत है।

तो, मुझे एक ऐसा फ़ंक्शन लिखना होगा जो एक स्ट्रिंग, डेटाबेस फ़ील्ड, एक अनुरोध फ़ॉर्म/क्वेरीस्टिंग फ़ील्ड, ??? स्वीकार करेगा, और उसके बाद इसे डबल में बदलने के लिए जो भी कर सकता है, उसे वापस कर दें कॉलिंग प्रक्रिया के लिए।

मुझे शॉर्ट्स, int16, int32, लंबे, अन्य सभी चीज़ों के लिए भी ऐसा करने की आवश्यकता होगी, जिनकी मैं संभवतः देखभाल कर सकता हूं।

तो मैं तारों के लिए ऐसा करूँगा। और तिथियां

क्या यह एक सार्थक प्रयास है? क्या ढांचे या सी # में कुछ ऐसा है जिसका मैं उपयोग कर सकता हूं? मुझे वास्तव में ऐसा कुछ चाहिए जो मुझे अन्य कार्यों को कॉल करने में डेटा इनलाइन का उपयोग करने की अनुमति दे, और अस्थायी चर बनाने की इजाजत न दे।

उत्तर

33

अंतर्निहित रूपांतरण कार्यों के स्कैड हैं। लेकिन ... मुझे यकीन नहीं है कि उनमें से कोई भी वही करता है जो आप चाहते हैं। आम तौर पर, अवैध इनपुट पास करते समय, .NET विधियों को सावधानी के पक्ष में गलती होती है, और अपवाद फेंक देते हैं।

public static T SafeConvert<T>(string s, T defaultValue) 
{ 
    if (string.IsNullOrEmpty(s)) 
     return defaultValue; 
    return (T)Convert.ChangeType(s, typeof(T)); 
} 

उपयोग::

SafeConvert(null, 0.0) == 0.0; 
SafeConvert("", 0.0) == 0.0; 
SafeConvert("0", 0.0) == 0.0; 

सौभाग्य से, आप आसानी से किसी भी उत्पादन प्रकार के एक अंकीय मान के एक स्ट्रिंग प्रतिनिधित्व, एक खाली स्ट्रिंग खाली है, या नल स्ट्रिंग परिवर्तित करने के लिए एक उपयोगिता विधि लिख सकते हैं

यह सामान्य विधि दूसरे रिटर्न के प्रकार से अपना रिटर्न प्रकार लेती है, जिसे पारित स्ट्रिंग शून्य या खाली होने पर डिफ़ॉल्ट मान के रूप में उपयोग किया जाता है। 0 पास करें और आपको In32 वापस मिल जाएगा। 0L, Int64 पास करें। और इतने पर ...

+0

मैं वास्तव में जेनरिक के उपयोग के लिए यह एक और कैसे है कि बचा सकता है मुझे तरीकों के दसियों बनाने की तरह की तरह कहते हैं। धन्यवाद! –

+0

यह बहुत अच्छा है, लेकिन अगर हम गतिशील रूप से रूपांतरित करने के लिए प्रकार प्राप्त कर रहे हैं तो हम डिफ़ॉल्ट मूल्य के रूप में क्या पास करेंगे? – Naomi

+0

मुझे लगता है कि TryParse सबसे अच्छा है। यह SafeConvert ("शून्य", 0) == 0 परिवर्तित नहीं कर सकता; –

6

सी # में अधिकांश डेटा प्रकार शून्य (संख्याएं, तिथियां, आदि) नहीं हैं, केवल तार हैं nullables। यदि आप एक DB से डेटा हो रही है, तो आप Nullable, या उसके वाक्यात्मक-sugared संस्करण, पूर्णांक ?, डबल ?, दिनांक समय ?, आदि

साथ संभावित काम हो जाएगा सभी nullables a method है कि आप प्राप्त करने की अनुमति है उनके वास्तविक मान, या डिफ़ॉल्ट मान अगर वे शून्य हैं। इससे आपको उन कार्यों को बनाने से बचने में मदद मिलनी चाहिए।

तारों के लिए, आपके पास स्ट्रिंग.इएसनुलऑरफेक्टी (स्ट्र) फ़ंक्शन है।

यदि आप कुछ विशेष उपलब्ध-उपलब्ध कार्यक्षमता चाहते हैं तो आप add extension methods भी कर सकते हैं। ध्यान दें कि एक्सटेंशन विधियों को शून्य मानों पर लागू किया जा सकता है, जब तक आप इसे कोड में संभाल लें। उदाहरण के लिए:

public static string ValueOrDefault(this string str) 
{ 
    if (String.IsNullOrEmpty(str)) return MY_DEFAULT_VALUE; 
    else return str; 
} 
1

.NET लाइब्रेरी में कनवर्ट नामक एक कक्षा है। इसमें ऐसे फ़ंक्शन हैं जो आपको किसी भी मूल प्रकार और कुछ सामान्य वर्गों (जैसे डेटटाइम) से कुछ भी बदलने की अनुमति देते हैं।

यह मूल रूप से Convert.ToInt32 (val) जैसा काम करता है;

संपादित करें: मुझे वास्तव में सभी शब्दों को पढ़ने के लिए सीखना होगा। शून्य के बारे में चिंता नहीं पकड़ी ... इसके लिए एक ऑपरेटर है। आप का उपयोग कर सकते हैं ?? शून्य के लिए जांच करने के लिए और एक डिफ़ॉल्ट प्रदान करने के लिए हालांकि यह काम कर सकता है।

आप केवल LINQ में देखना चाहते हैं, यह आपके लिए बहुत सारे मैपिंग को संभालता है।

0

मुझे लगता है कि यह @ शोग 9 के समान है। मैं उपयोगकर्ता असामान्य इनपुट को संभालने के लिए बस कोशिश करें। मैं उस प्रकार को भेजता हूं जिसमें मैं इनपुट को कन्वर्ट करना चाहता हूं और इनपुट को ऑब्जेक्ट के रूप में लेना चाहता हूं।

public static class SafeConverter 
{ 
    public static T SafeConvert<T>(object input, T defaultValue) 
    { 
     if (input == null) 
      return defaultValue; //default(T); 

     T result; 
     try 
     { 
      result = (T)Convert.ChangeType(input.ToString(), typeof(T)); 
     } 
     catch 
     { 
      result = defaultValue; //default(T); 
     } 
     return result; 
    } 
} 

अब उन्हें

नीचे
SafeConverter.SafeConvert<ushort>(null, 0); 
SafeConverter.SafeConvert<ushort>("", 0); 
SafeConverter.SafeConvert<ushort>("null", 0); 
SafeConverter.SafeConvert<ushort>("-1", 0); 
SafeConverter.SafeConvert<ushort>("6", 0); 
SafeConverter.SafeConvert<ushort>(-1, 0); 
SafeConverter.SafeConvert<ushort>(0, 0); 
SafeConverter.SafeConvert<ushort>(1, 0); 
SafeConverter.SafeConvert<ushort>(9, 0);