ऐरे क्यों है। लम्बाई एक int, और एक यूंट नहीं

Array.Length एक int क्यों है, न कि uint । यह मुझे परेशान करता है (बस थोड़ा सा), क्योंकि लंबाई का मूल्य कभी नकारात्मक नहीं हो सकता है।

इसने मुझे अपनी कक्षा में लंबी अवधि के लिए एक int का उपयोग करने के लिए मजबूर किया, क्योंकि जब आप एक इंट-वैल्यू निर्दिष्ट करें, इसे स्पष्ट रूप से डालने की जरूरत है ...

तो अंतिम सवाल यह है: क्या एक हस्ताक्षरित int ( uint ) के लिए कोई उपयोग है? यहां तक ​​कि माइक्रोसॉफ्ट भी उनका उपयोग नहीं करता है।

0
ro fr bn
@ alan2 जहां ऐसा परिवर्तन करने से लगभग सभी कोड टूट जाएंगे, तो अगर आप मुझसे पूछें तो ऐसा नहीं होगा!
जोड़ा लेखक Peter, स्रोत
नीचे उठाए गए मुद्दों के बावजूद, मुझे लगता है कि इसे यूआईएनटी में बदलना चाहिए।
जोड़ा लेखक alan2here, स्रोत

4 उत्तर

आम तौर पर, पूर्णांक मानों पर हस्ताक्षर किए जाते हैं, जब तक कि आपको स्पष्ट रूप से एक हस्ताक्षरित मूल्य की आवश्यकता न हो। यह वही तरीका है जिसका उपयोग किया जाता है। मैं उस विकल्प से सहमत नहीं हो सकता, लेकिन यह वही तरीका है।

उस समय के लिए, आजकल सामान्य स्मृति बाधाओं के साथ, यदि आपकी सरणी या समान डेटा संरचना को UInt32 लंबाई की आवश्यकता है, तो आपको अन्य डेटा संरचनाओं पर विचार करना चाहिए।

बाइट्स की एक सरणी के साथ, Int32 आपको 2 जीबी मूल्य देगा

0
जोड़ा
"लेकिन यह वही तरीका है।" - नहीं, चीज़ें कभी भी वैसे ही नहीं होती हैं। हमेशा एक डिजाइन निर्णय लिया जा रहा है, और यह हमेशा पूछने का भुगतान करता है क्यों। कोई भी पेशेवरों और विपक्ष से कुछ सीख सकता है, या डिजाइनर (कुछ मामलों में) उनके बारे में चर्चा में संलग्न हो सकता है। हमेशा सवाल पूछो! :)
जोड़ा लेखक Jonas Kölker, स्रोत

बिना हस्ताक्षर किए गए int सीएलएस अनुपालन नहीं है और इसलिए संपत्ति के उपयोग को उन भाषाओं में प्रतिबंधित कर देगा जो UInt को लागू करते हैं।

यहाँ देखें:

फ्रेमवर्क 1.1

.NET Framework क्लास लाइब्रेरी का परिचय

फ्रेमवर्क 2.0

.NET Framework क्लास लाइब्रेरी अवलोकन

0
जोड़ा

बहुत से कारण:

  • uint is not CLS compliant, thus making a built in type (array) dependent on it would have been problematic
  • The runtime as originally designed prohibits any object on the heap occupying more than 2GB of memory. Since the maximum sized array that would less than or equal to this limit would be new byte[int.MaxValue] it would be puzzling to people to be able to generate positive but illegal array lengths.
  • Historically C# inherits much of its syntax and convention from C and C++. In those arrays are simply pointer arithmetic so negative array indexing was possible (though normally illegal and dangerous). Since much existing code assumes that the array index is signed this would have been a factor
  • On a related note the use of signed integers for array indexes in C/C++ means that interop with these languages and unmanaged functions would require the use of ints in those circumstances anyway, which may confuse due to the inconsistency.
  • The BinarySearch implementation (a very useful component of many algorithms) relies on being able to use the negative range of the int to indicate that the value was not found and the location at which such a value should be inserted to maintain sorting.
  • When operating on an array it is likely that you would want to take a negative offset of an existing index. If you used an offset which would take you past the start of the array using unit then the wrap around behaviour would make your index possibly legal (in that it is positive). With an int the result would be illegal (but safe since the runtime would guard against reading invalid memory)
0
जोड़ा
यह बहुत जानकारीपूर्ण है। विंडोज संचार संचार फाउंडेशन में .NET 4.0 के रूप में - maxArrayLength और maxBytesPerRead के लिए सबसे बड़ा मान 2,147,483,647 था, जो इस जानकारी के साथ पूर्ववर्ती रूप से बहुत अधिक समझ में आता है। बिंदुओं को कनेक्ट करना...
जोड़ा लेखक Derek W, स्रोत
वास्तव में लेकिन ((uint) (int.MaxValue)) + 1 कुछ भी के लिए गलत गारंटी होगी। int खुद को बिल्कुल सही से दूर है, लेकिन चीजों का संतुलन इस प्रकार के रूप में int के साथ रहने के लिए वैध बनाता है।
जोड़ा लेखक ShuggyCoUk, स्रोत
एक स्पष्टीकरण ArrayIndex प्रकार (अनिवार्य रूप से size_t) के साथ शुरू करना जो आवश्यक रूप से एक int के लिए साफ और सुरक्षित रूप से अनुवाद करेगा, भविष्य में शायद कम दर्द के साथ भविष्य में> 2 जीबी सरणी के लिए अनुमति देने के लिए भविष्य में इसे आसान बना देगा। लेकिन व्यावहारिक कहते हैं कि जावा की एक ही समस्या है तो जोखिम क्यों लें
जोड़ा लेखक ShuggyCoUk, स्रोत
बस असुरक्षित संदर्भों में उस सी # पॉइंटर अंकगणित को जोड़ना चाहते हैं, नकारात्मक सूचकांक भी देता है। यहां उदाहरण देखें: docs.microsoft.com/en -US / डॉटनैट / कोई तिथि नहीं / भाषा-संदर्भ / & hellip;
जोड़ा लेखक Mike Marynowski, स्रोत
यदि ढेर पर कुछ भी 2 जीबी से अधिक नहीं हो सकता है, तो लगभग सभी सरणी लंबाई int.MaxValue अवैध हैं क्योंकि अधिकांश प्रकार 1 बाइट से बड़े होते हैं।
जोड़ा लेखक ScottS, स्रोत

ऐसा लगता है कि किसी ने "अंतिम प्रश्न" का उत्तर नहीं दिया है।

मेरा मानना ​​है कि हस्ताक्षर किए गए इनट्स का प्राथमिक उपयोग बाह्य प्रणालियों (पी / आमंत्रण और इसी तरह) के साथ आसान इंटरफेसिंग प्रदान करना है और .NET को पोर्ट की जाने वाली विभिन्न भाषाओं की आवश्यकताओं को कवर करना है।

0
जोड़ा
अहस्ताक्षरित प्रकार आवश्यक जब कई छोटे मूल्यों श्रृंखलाबद्ध कोई बड़ी चित्र के उत्पादन के लिए कर रहे हैं। एक कंप्यूटिंग द्वारा (HighPart << 16) + LowPart , और एक दो UInt16 के में एक UInt32 विभाजित कर सकते हैं (Uint16) के माध्यम से (मूल्य >> 16) <�एक UInt32 बनाने के लिए दो UInt16 के गठजोड़ कर सकते हैं / code> और (Uint16) (मूल्य और 65535) । यदि LowPart एक हस्ताक्षरित प्रकार होना ही था इस तरह के आपरेशनों बहुत असुविधाजनक होगा। जैसा कि कहा गया गया है, पर हस्ताक्षर किए और अहस्ताक्षरित प्रकार के बीच बातचीत अक्सर भ्रमित और संदिग्ध हैं। अहस्ताक्षरित प्रकार
जोड़ा लेखक supercat, स्रोत