2008-10-02 13 views
6

मैं .NET में शून्य मानों और चर के बारे में थोड़ा उलझन में हूं। (वीबी पसंदीदा).NET DBNull बनाम सभी चर प्रकारों में कुछ भी नहीं?

क्या किसी भी दिए गए चर के "शून्यता" को जांचने का कोई तरीका है चाहे वह एक वस्तु या मूल्य प्रकार हो? या क्या मेरी शून्य जांच हमेशा यह अनुमान लगाना चाहती है कि क्या यह एक मान प्रकार (उदा। System.Integer) या ऑब्जेक्ट की जांच कर रहा है?

मुझे लगता है कि मैं जो खोज रहा हूं वह एक ऐसा कार्य है जो सभी संभावित प्रकार की नल-नेस की जांच करता है। यही कारण है, चर के किसी भी प्रकार कि

क) के बाद से घोषित

ख एक मूल्य सौंपा कभी नहीं थे) एक डेटा वस्तु (है कि एक डेटाबेस से आया)

ग से एक शून्य मान) सौंपा गया गया है सेट एक अन्य वैरिएबल वैल्यू के बराबर है जो शून्य

डी) को एएसपी.NET सत्र/एप्लिकेशन वैरिएबल पर सेट किया गया था जो कभी सेट या समाप्त नहीं हुआ था।

क्या .NET में शून्य परिदृश्यों को संभालने की बात आती है जब कोई सामान्य सर्वोत्तम अभ्यास होता है?

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

उत्तर

2

सामान्य मूल्य प्रकार (बूलियन, इंट्स, लम्बे, फ्लोट, डबल, एनम और structs) शून्य नहीं हैं।

सभी मूल्य प्रकार के लिए डिफ़ॉल्ट मान 0.

CLR है आप चर का उपयोग नहीं दूँगी जब तक कि वे बनाए गए हैं। आपको लगता है कि यह हमेशा मामला नहीं है, लेकिन कभी-कभी सीएलआर कदम उठाता है और उन्हें आपके लिए शुरू करता है। एक विधि स्तर पर आपको उपयोग किए जाने से पहले सभी चरों को स्पष्ट रूप से प्रारंभ करना होगा।

आगे, जैसा कि अन्य इंगित करते हैं, नेट 2.0 के बाद से Nullable<T> नामक एक नया सामान्य प्रकार है। सी # जैसे int में कुछ कंपाइलर shorthands हैं? मतलब Nullable<int>, डबल? मतलब Nullable<double> आदि

आप केवल Nullable<T> को गैर-शून्य मूल्य मानों पर लपेट सकते हैं, जो ठीक है क्योंकि संदर्भों में पहले से ही शून्य होने की क्षमता है।

int? x = null; 

किसी पूर्णांक के लिए ?, जब तुम अशक्त के खिलाफ परीक्षण कर सकते हैं, यह कभी कभी x.HasValue() कॉल करने के लिए बेहतर होता है।

सी # में nullable coalescing operator भी है ?? जब आप एक गैर-शून्य मूल्य प्रकार को शून्य करने के लिए असाइन करना चाहते हैं। लेकिन अगर आपके पास ऑपरेटर नहीं है, तो आप GetValueOrDefault() को कॉल कर सकते हैं।

int y = x ?? 2; // y becomes 2 if x is null. 
int z = x.GetValueOrDefault(2); // same as y 
4

मूल्य प्रकार शून्य नहीं हो सकते हैं। यह वैल्यू टाइप होने का मतलब है इसका उल्लंघन करता है। आप मूल्य प्रकार को शून्य (टी के) के रूप में लपेट सकते हैं जो आपको विधियों का एक बड़ा सेट देता है, और कुछ भी काम करने के लिए जांच नहीं करता है। लेकिन आपके पास उस रैपर के साथ बहुत अधिक ओवरहेड है। शायद आप यह स्पष्ट कर सकते हैं कि आप क्या करने की कोशिश कर रहे हैं?

पूर्णता के लिए Nullable रैपर के लिए वीबी वाक्य रचना है:

Dim i as Nullable(Of Integer) = Nothing '.NET 2.0/3.0' 
Dim j as Integer? = Nothing '.NET 3.5' 

संपादित करें: मान प्रकार हमेशा की तरह, एक डिफ़ॉल्ट मान पर preinitialized रहे हैं numerics के लिए 0, Booleans के लिए झूठी, आदि

+0

नियम यह है कि सभी मूल्य प्रकार के लिए, डिफ़ॉल्ट (आदि पूर्णांक, लंबे, नाव, डबल, enums, structs,) 0. है –

0

मूल्य प्रकार चर शून्य नहीं हो सकता है, ऐसा इसलिए है क्योंकि क्या शून्य मतलब है, शून्य का मतलब है कि संदर्भ कहीं भी इंगित नहीं करते हैं। मैं नहीं जानता कि VB.net पर लेकिन सी # पर आप मूल्य प्रकार लपेट कर सकते हैं, जैसे का उपयोग कर nullables होने के लिए "?":

int? a = null; 
+0

पूर्णांक है? Nullable के लिए सिर्फ एक सी # कंपाइलर शॉर्टेंड है। –

2

इस है कि तुम क्या करने के बाद कर रहे हैं?

if IsNothing(foo) OrElse IsDbNull(foo) Then 
    ' Do Something Because foo Is Either Nothing or DBNull.Value 
End If 

सच में मुझे यकीन नहीं है कि आप इस संरचना के लिए क्यों चाहते हैं। केवल एक बार जब मैं DBNULL.Value की जांच करता हूं, तब मैं डेटाबेस से आने वाले मानों का उपयोग कर रहा हूं, और इससे पहले कि मैं डेटा नामस्थान वर्ग से कुछ अन्य वर्ग में मान निर्दिष्ट करता हूं [यानी। स्ट्रिंग = डेटा रीडर (0) के रूप में मंद बी]।

आमतौर पर, यदि आप किसी ऑब्जेक्ट के बारे में चिंतित हैं, जिसे तत्काल नहीं किया गया है, या इसे फिर से चालू करने की आवश्यकता है, तो बस एक IsNothing चेक पर्याप्त होगा।

1

नेट में केवल दो प्रकार के शून्य हैं जिन्हें मैं जानता हूं, शून्य (वीबी में कुछ भी नहीं) और डीबीएनयूएल। यदि आप सिस्टम का उपयोग कर रहे हैं। अनुपयोगी, आप उसी ऑब्जेक्ट के साथ उसी नल जांच सिंटैक्स का उपयोग कर सकते हैं। यदि आपकी नलिका ऑब्जेक्ट को बॉक्स किया गया है तो .NET 2.0 CLR यह संभालने का सही तरीका जानने के लिए पर्याप्त स्मार्ट है।

एकमात्र मामला जो मैंने दोनों प्रकारों में चलाया है, उस एप्लिकेशन के डेटा स्तर में है जहां मैं सीधे डेटाबेस डेटा तक पहुंच सकता हूं। उदाहरण के लिए, मैंने डेटाटेबल में डीबीएनयूएल में भाग लिया है। जब तक

static public bool IsNull(this object obj) 
{ 
    return obj != null && obj != DbNull.Value; 
} 

... 

if(dataTable[0]["MyColumn"].IsNull()) 
{ 
    //do something 
} 
0

के रूप में आप विकल्प सख्त पर साथ विकसित कर रहे हैं, (क) shouldn ': इस situration में इन अशक्त प्रकार दोनों के लिए जाँच करने के लिए, आप की तरह एक विस्तार विधि (क्षमा करें, सी # में) लिख सकता है एक मुद्दा नहीं है। कंपाइलर आप पर चिल्लाना होगा। यदि आप पैरामीटर की जांच करने के बारे में चिंतित हैं, तो बस

Public Sub MySub(ByVal param1 as MyObject, ByVal param2 as Integer) 
    if param1 is nothing then 
     Throw New ArgumentException("param1 cannot be null!") 
    end if 
    'param2 cannot be null 
End Sub 

के लिए (बी), आपके डेटाबेस इंटरैक्शन परत को इसे संभालना चाहिए। यदि आप LINQ का उपयोग कर रहे हैं, तो इसे संभालने के तरीके हैं। यदि आप टाइप किए गए डेटा सेट का उपयोग कर रहे हैं, तो वहां एक IsMyVariableNull प्रॉपर्टी है जो स्वतः उत्पन्न होती है।

(सी) के लिए, आपको मूल्य प्रकारों के बारे में चिंता करने की आवश्यकता नहीं है, लेकिन संदर्भ प्रकारों को सरल के साथ चेक किया जा सकता है (या कुछ भी नहीं है)।

(डी) के लिए, आप पढ़ने के बाद एक ही तर्क लागू कर सकते हैं। कुछ भी के खिलाफ प्राप्त चर का परीक्षण करें।

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

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