2010-01-28 19 views
12

मैं एक पूर्णांक चर होना चाहता हूं जिसे शून्य पर सेट किया जा सकता है और int? myVariable वाक्यविन्यास का उपयोग नहीं करना चाहता। मैंने int और Int16 का उपयोग करने का कोई फायदा नहीं लिया। क्या मुझे int? myVariable का उपयोग करना है?सी # में पूर्णांक संदर्भ प्रकार क्या है?

मैंने इसका उल्लेख इसलिए किया क्योंकि जावा में एक 'int' प्रकार (एक आदिम) और 'इंटीजर' (एक संदर्भ प्रकार) दोनों है। मैं यह सुनिश्चित करना चाहता था कि एक अंतर्निहित पूर्णांक संदर्भ प्रकार नहीं है जिसे मैं उपयोग कर सकता हूं। मैं 'int' का उपयोग करूंगा मैं क्या कर रहा हूँ के लिए।

+5

... आप उस वाक्यविन्यास का उपयोग क्यों नहीं करना चाहते हैं? – womp

+3

@ जोन, यह ऐसा है ... मैं चाहता हूं कि संकलक इसे बिना कहने के मुझे जान सके। – Dykam

उत्तर

26

जानकारी के लिए, int?/Nullable<T> संदर्भ-प्रकार नहीं है; यह केवल एक "शून्य प्रकार" है, जिसका अर्थ है: एक विशेष संरचना (अनिवार्य रूप से और int और bool ध्वज) विशेष कंपाइलर नियम (पुनः शून्य जांच, ऑपरेटरों, आदि) और सीएलआई नियमों (मुक्केबाजी/अनबॉक्सिंग के लिए) के साथ। वहाँ , कोई "पूर्णांक संदर्भ-प्रकार" .NET में है जब तक आप बॉक्सिंग गिनती:

int i = 123; 
object o = i; // box 

लेकिन यह एक अनावश्यक वस्तु बनाता है और इससे जुड़े अन्य मुद्दों के बहुत सारे है।

जो आप चाहते हैं, int? आदर्श होना चाहिए। आप लंबे हाथ के सिंटैक्स (Nullable<int>) का उपयोग कर सकते हैं, लेकिन आईएमओ यह अनावश्यक रूप से वर्बोज़ है, और मैंने इसे लोगों को भ्रमित कर देखा है।

+4

IMHO _? _ भ्रम पृष्ठभूमि पर निर्भर करता है - यह रूबी लोगों को भ्रमित करता है। हम न्यूकॉमर्स –

+0

के लिए न्यूलबल इसे गुगल करने योग्य और msdnable :) का उपयोग कर रहे हैं। आप उस परिदृश्य से कैसे निपटेंगे जहां आपके पास IDictionary है जो कि आप विभिन्न वस्तुओं के लिए गणना के रूप में उपयोग करते हैं। कोड "theDictionary [someObject] = newValue" इंडेक्सर कॉल ("[..]") से लौटाए गए मान के रूप में काम नहीं करेगा, शब्दकोश के KeyValuePair instance में संग्रहीत वही मान का ऑब्जेक्ट संदर्भ नहीं है। काउंटर को बढ़ाने के लिए आपको केवीपी को हटाना होगा और केवीपी में कोई भी नया मूल्य लिखने के लिए इसे फिर से जोड़ना होगा? या क्या कोई और तरीका है? – Marchy

+1

@ मार्की 'डिक्शनरी [someObject] = newValue' ठीक काम करेगा; यह एक सूचकांक के लिए असाइनमेंट है, जो अच्छी तरह से परिभाषित और पूरी तरह से समर्थित है –

2

हां, यह एकमात्र तरीका है, क्योंकि Int32/Int16/int एक आदिम प्रकार है (इनके मुक्केबाजी/अनबॉक्सिंग के बावजूद)।

8

हाँ आप नल प्रकार

का उपयोग करना चाहिए देखें Nullable

Nullable<int> Nullable<float> 

या बस

int? float? 

पुनश्च:

आप उपयोग करने के लिए नहीं करना चाहते हैं? नोटेशन या नीलबल बिल्कुल - बस ऐसी चीज के लिए विशेष संरचनाओं का उपयोग करें। उदाहरण DataTable के लिए:

var table = new DataTable(); 
table.Columns.Add('intCol',typeof(int)); 
var row = table.NewRow(); 
row['intCol'] = null; // 
+0

ध्यान दें कि यह आपके लिंक के अनुसार एक संदर्भ प्रकार नहीं है ("एक मान प्रकार का प्रतिनिधित्व करता है जिसे शून्य सौंपा जा सकता है")। लेकिन अगर ओपी की अंतर्निहित समस्या का जवाब है, तो शीर्षक में सवाल नहीं है। – Kat

0

<var>? वाक्य रचना यह व्यर्थ बनाता है। यदि आप थोड़ा गहरा खोदते हैं, तो आप देखेंगे कि यह केवल एक सामान्य वस्तु है जिसका उपयोग किया जाता है।

यदि आप इसे सी ++ की तरह करना चाहते हैं तो आपको असुरक्षित संचालन का उपयोग करना होगा। फिर, सी में पॉइंटर्स उपलब्ध हैं, लेकिन आपका कोड सीएलआर के अनुरूप नहीं है ...

पॉइंटर्स के बिना शुद्ध .NET का उपयोग करने के लिए, ? जाने का तरीका है।

+5

यह एक वस्तु नहीं है, Nullable एक संरचना है। –

0

हां। यही कारण है कि माइक्रोसॉफ्ट ने कहा कि। लोग अपनी खुद की नालीबल कक्षा बना रहे थे ताकि वे इस पैटर्न को .NET में शामिल कर सकें।

0

यदि आप ? से नफरत करते हैं तो आप System.Nullable<int> का उपयोग कर सकते हैं।

0

आप एक नल प्रकार का उपयोग करना होगा, यानी:

Nullable<int> or int? 

नल प्रकार का उद्देश्य, आप सक्षम करने के लिए किया जाता है एक मूल्य प्रकार के लिए शून्य असाइन करने के लिए।

MSDN से

:

Nullable प्रकार पते के परिदृश्य में जहाँ आप एक अशक्त (या अज्ञात) मूल्य के साथ एक आदिम प्रकार के लिए सक्षम होना चाहता हूँ। यह डेटाबेस परिदृश्यों में आम है, लेकिन यह अन्य परिस्थितियों में भी उपयोगी है।

  1. एक बॉक्स्ड मूल्य के प्रकार:

    अतीत में, वहाँ ऐसा करने के कई तरीके थे। यह संकलन-समय पर दृढ़ता से टाइप नहीं किया गया है, और इसमें हर प्रकार के लिए एक ढेर आवंटन करना शामिल है।

  2. मूल्य प्रकार के लिए एक वर्ग रैपर। यह दृढ़ता से टाइप किया गया है, लेकिन अभी भी एक ढेर आवंटन शामिल है, और आपको रैपर लिखना है।
  3. एक संरचना रैपर जो शून्यता की अवधारणा का समर्थन करता है। यह एक अच्छा समाधान है, लेकिन आपको इसे स्वयं लिखना है।
संबंधित मुद्दे