2008-10-21 11 views
5

मुझे एक निश्चित उत्तर नहीं मिल रहा है। सी # 2.0 के बाद से आप के लिएवीबीएनईटी का इतिहास निरर्थक वाक्यविन्यास

Nullable<int> i = Nullable<int>(123); 

आशुलिपि के रूप में

int? i = 125; 

घोषित कर लिया है मैंने कहीं पढ़ने कि VB.NET इस शॉर्टकट की अनुमति नहीं दी याद। लेकिन कम और देखो, मैंने इसे आज वीएस 2008 में आजमाया और यह काम करता है।

क्या किसी को पता है कि यह .NET 2.0 के बाद से इस तरह से किया गया है या बाद में इसे जोड़ा गया था?

उत्तर

13

सिस्टम.Nullable .NET 2.0 में पेश किया गया था और एक सामान्य प्रकार के रूप में वीबी पर उपलब्ध है। आप नलिका सिंटैक्स का उपयोग नहीं कर सकते हैं। तो वी.एस. 2005 में आप कर सकते हैं:

Dim x as Nullable(of Integer) 

मैं अगर शून्य तुल्यता और मुक्केबाजी वीबी 2005 में nullables लिए काम करता है पता नहीं है, लेकिन मुझे लगता है यह होगा कि जवाब है हां के बाद से नेट टीम में एक परिवर्तन किया नलिकाओं के साथ मुक्केबाजी को पूरा करने के लिए 2.0 सीएलआर। मुझे लगता है कि वीबी इसका लाभ उठाता है।

2008 में, आपको स्पष्ट रूप से सिर्फ कर सकते हैं:

Dim x as Integer? 
+0

शून्य समकक्ष और मुक्केबाजी वीबी 2005 में काम किया। 2008 में हुए बदलावों ने "?" को जोड़ने पर ध्यान केंद्रित किया वाक्यविन्यास, और ऑपरेटर उठाने को लागू करना। ध्यान देने योग्य एक बात, हालांकि, "?" के लिए वह समर्थन है सिंटैक्स वीएस कोड मॉडल/कोड डीओएम में नहीं जोड़ा गया था, इसलिए किसी भी डिजाइनर जेनरेट कोड जो नलबल प्रकारों का उपयोग करता है हमेशा पुराने जेनेरिक वाक्यविन्यास का उपयोग करेगा। –

0

मुझे इतिहास नहीं पता, लेकिन हाँ यह एक वीएस 2008 वृद्धि थी।

+0

पृथ्वी पर क्यों यह एक स्वीकार्य उत्तर है? –

3

यह वीबी 2005 (डॉटनैट 2.0) में काम करता है, लेकिन यह बदसूरत है।

आप इसे सामान्य चर की तरह उपयोग नहीं कर सकते, मैंने सोचा कि यह ऑब्जेक्ट प्रकार की तरह काम कर सकता है लेकिन ऐसा नहीं है।

बल्कि इस से:

dim oInt as object 

dim i as integer 

if oInt is nothing then 

    msgbox("int is null") 
else 

    i = cint(oInt) 

end if 

आप इस किया है।

Dim oInt as nullable(of integer) 

dim i as integer 

if oInt.HasValue = false then 

    msgbox("int is null") 

else 

    i = oInt.Value 

end if 

समस्या यहां है कि यदि आपके चर रिक्त है और आप मूल्य संपत्ति यह एक बिना क्रिया का अपवाद अप barfs आह्वान करने के लिए होता है।

इसलिए उदाहरण के लिए, मेरा पसंदीदा यह है।

AddParamToSQLCmd(sqlCmd, "@SomeID", SqlDbType.Int, 0, ParameterDirection.Input, iif(oInt.HasValue, oInt.Value, DBNull.value)) 

परिणामस्वरूप एक रनटाइम त्रुटि होगी जब आपका अनुमानित शून्य मूल्य शून्य होगा !!!

इसलिए यहाँ बनाम

नल (पूर्णांक) ऑब्जेक्ट कोड

if oInt.HasValue then 
    AddParamToSQLCmd(sqlCmd, "@SomeID", SqlDbType.Int, 0, ParameterDirection.Input, oInt.Value) 
else 
    AddParamToSQLCmd(sqlCmd, "@SomeID", SqlDbType.Int, 0, ParameterDirection.Input, dbnull.value) 
end if 

वस्तु

AddParamToSQLCmd(sqlCmd, "@SomeID", SqlDbType.Int, 0, ParameterDirection.Input, oInt) 
+1

पैरामीटर जोड़ने का एक आसान तरीका 'नया' 'अगर' ऑपरेटर: AddParamToSQLCmd (sqlCmd, "@SomeID", SqlDbType.Int, 0, पैरामीटर डायरेक्शन. इनपुट, यदि (oInt.HasValue, oInt.Value, DBNull.value)) कारण यह है कि उपर्युक्त काम यह है कि यदि एक एहॉर्ट-सर्किट ऑपरेटर है, जबकि आईआईएफ विधि कॉल के दोनों तरफ मूल्यांकन किया जाता है, भले ही पहला ऑपरेंड सही साबित हो। –

1

IIRC (पूर्णांक) व्यर्थ है, नल प्रकार एक पर .NET 2.0 में पेश किए गए बहुत देर से मंच। सी # कंपाइलर टीम ने वीबीएनईटी टीम की तुलना में उनके लिए अधिक भाषा समर्थन में घूमने में कामयाब रहे। VB.NET टीम VS2008 में कम या ज्यादा पकड़ी गई। यही कारण है कि, उदाहरण के लिए, आप == ऑपरेटर का उपयोग सी # 2.0 में नलिकाओं की तुलना करने के लिए कर सकते हैं जबकि वीबी.नेट में आपको Nullable.Equals() विधि के साथ रखना होगा। गरर।