मेरे पास अपनी उपयोगिता पुस्तकालय में लिखी गई कुछ विधियाँ हैं, जिन पर मैंने बहुत भरोसा किया है। पहला वह तरीका है जो किसी भी प्रकार को उसके संबंधित Nullable <टाइप> फॉर्म में परिवर्तित करता है:
public static Type GetNullableType(Type TypeToConvert)
{
if (TypeToConvert == null)
return null;
if (IsTypeNullable(TypeToConvert))
return TypeToConvert;
if (TypeToConvert.IsValueType && TypeToConvert != typeof(void))
return typeof(Nullable<>).MakeGenericType(TypeToConvert);
return null;
}
दूसरी विधि केवल यह बताती है कि क्या दिया गया प्रकार अशक्त है। इस विधि को पहले कहा जाता है और अलग से उपयोगी है:
public static bool IsTypeNullable(Type TypeToTest)
{
if (TypeToTest == null)
return false;
if (!TypeToTest.IsValueType)
return true;
return TypeToTest.IsGenericType && TypeToTest.GetGenericTypeDefinition() == typeof(Nullable<>);
}
उपरोक्त IsTypeNullable कार्यान्वयन हर बार एक विजेता की तरह काम करता है, लेकिन यह अपने अंतिम कोड लाइन में थोड़ा वर्बोज़ और धीमा है। निम्नलिखित कोड निकाय IsTypeNullable के लिए ऊपर के समान है, अंतिम कोड लाइन को छोड़कर सरल और तेज है:
if (TypeToTest == null)
return false;
if (!TypeToTest.IsValueType)
return true;
return Nullable.GetUnderlyingType(TypeToTest) != null;
का आनंद लें!
निशान
पुनश्च - "अशक्तता" के बारे में
मुझे एक अलग पोस्ट में किए गए अशक्तता के बारे में एक बयान दोहराना चाहिए, जो इस विषय को ठीक से संबोधित करने के लिए सीधे लागू होता है। यही है, मेरा मानना है कि यहां चर्चा का फोकस यह नहीं होना चाहिए कि यह देखने के लिए कैसे जांचा जाए कि कोई वस्तु एक सामान्य अशक्त प्रकार है, बल्कि यह भी कि क्या कोई अपने प्रकार की वस्तु के लिए अशक्त का मान प्रदान कर सकता है। दूसरे शब्दों में, मुझे लगता है कि हमें यह निर्धारित करना चाहिए कि क्या कोई वस्तु अशक्त है, न कि यह अशक्त है। अंतर शब्दार्थ में है, अर्थात् अशक्तता का निर्धारण करने के लिए व्यावहारिक कारण, जो कि आमतौर पर सभी मायने रखता है।
रन-टाइम (वेब सेवाओं, रिमोट कॉल, डेटाबेस, फीड इत्यादि) तक संभवतया अज्ञात प्रकार की वस्तुओं का उपयोग करने वाली प्रणाली में, एक सामान्य आवश्यकता यह निर्धारित करने के लिए है कि क्या किसी नल को वस्तु को सौंपा जा सकता है, या क्या वस्तु शामिल हो सकती है एक अशक्त। गैर-अशक्त प्रकारों पर इस तरह के ऑपरेशनों को निष्पादित करने से आमतौर पर अपवाद उत्पन्न होंगे, जो प्रदर्शन और कोडिंग आवश्यकताओं के संदर्भ में बहुत महंगे हैं। इस तरह की समस्याओं से बचने के लिए अत्यधिक पसंदीदा दृष्टिकोण लेने के लिए, यह निर्धारित करना आवश्यक है कि क्या एक मनमाना प्रकार का ऑब्जेक्ट अशक्त होने में सक्षम है; यानी, चाहे वह आम तौर पर 'अशक्त' हो।
एक बहुत ही व्यावहारिक और विशिष्ट अर्थ में, .NET की शर्तों में अशक्तता बिल्कुल नहीं है कि किसी वस्तु का प्रकार अशक्त का एक प्रकार है। वास्तव में कई मामलों में, वस्तुओं में संदर्भ प्रकार होते हैं, इसमें एक अशक्त मूल्य हो सकता है, और इस तरह सभी अशक्त होते हैं; इनमें से कोई भी अशक्त प्रकार नहीं है। इसलिए, अधिकांश परिदृश्यों में व्यावहारिक उद्देश्यों के लिए, अशक्तता की सामान्य अवधारणा, बनाम अशक्त की कार्यान्वयन-निर्भर अवधारणा के लिए परीक्षण किया जाना चाहिए। इसलिए हमें केवल .NET Nullable प्रकार पर ध्यान केंद्रित करके नहीं लटकाया जाना चाहिए, बल्कि सामान्यता, व्यावहारिकता की व्यावहारिक अवधारणा पर ध्यान केंद्रित करने की प्रक्रिया में इसकी आवश्यकताओं और व्यवहार की हमारी समझ को शामिल करना चाहिए।