2015-06-01 6 views
12

यह मेरे लिए बेहद अजीब लगता है कि Stream.Writeint का उपयोग करता है, UInt के बजाय ... क्या इस तथ्य के लिए "विरासत" कोड के अलावा कोई स्पष्टीकरण है? किसी भी एक -1 बाइट्स लिखना चाहते हैं?!?क्यों Stream.Write नहीं एक uint लेती है?

उत्तर

19

बिना हस्ताक्षर किए गए प्रकार सीएलएस-अनुरूप नहीं हैं, इसलिए Stream.Write ऑफसेट और गिनती के लिए uint का उपयोग नहीं करता है।

देखें: uint (C# Reference)

uint प्रकार सीएलएस अनुरूप नहीं है। जब भी संभव हो int का प्रयोग करें।

लेकिन वहाँ एक मुद्दा यह है कि आ रहा रखता है: यही कारण है कि बताते हैं Why we don't have unsigned types in the CLS by Brad Abrams (2 Sep 2003):

एक पुराने लेख नहीं है क्यों हम अनुमति नहीं दी में अहस्ताक्षरित प्रकार (UInt32 और की तरह) सीएलएस?

ठीक है, इस प्रश्न के लिए वास्तव में दो उत्तर हैं। पहले स्तर पर कुछ भाषाओं (जैसे VB.NET के रूप में) अहस्ताक्षरित प्रकार के लिए पूरा समर्थन नहीं करते हैं। उदाहरण के लिए आप में VB.NET ... अहस्ताक्षरित शाब्दिक नहीं हो सकता। लेकिन निष्पक्ष होना करने के लिए कि एक पूरी तरह से संतोषजनक जवाब क्योंकि जब हम सीएलएस शुरू कर दिया तो आप या तो VB.NET में उपवर्ग नहीं कर सकता है नहीं है, लेकिन हम उस भाषा क्या हम लोग चाहेगा पता था कि समर्थन करने के लिए बढ़ाया। हम हस्ताक्षर किए गए प्रकारों के साथ एक ही काम कर सकते थे। लेकिन हम ऐसा नहीं किया। क्यों नहीं? खैर, यह एक गहरा कारण हो जाता है। वास्तव में इसी कारण से सी # भाषा के प्रारंभिक बीटा बिना हस्ताक्षर किए गए प्रकार (कोई यूहॉर्ट, यूंट और इसी तरह) का समर्थन नहीं करते थे।

हम में से कई लोगों के बीच सामान्य भावना यह है कि प्रोग्रामिंग का विशाल बहुमत हस्ताक्षरित प्रकारों के साथ किया जाता है। जब भी आप हस्ताक्षरित प्रकारों पर स्विच करते हैं तो आप मानसिक मॉडल स्विच (और एक बदसूरत कास्ट) को मजबूर करते हैं। सबसे खराब कलाकारों में आप एपीआई की पूरी समांतर दुनिया बनाते हैं जो बिना हस्ताक्षर किए गए प्रकार लेते हैं। "< 0" से बचने के लिए मान सीएलएस में जेनरिक के समावेशन के लायक नहीं है।

(नोट VB.Net (वीबी 8 बाद) के नए संस्करण अहस्ताक्षरित प्रकार का समर्थन करता है कि)

[System.Security.SecuritySafeCritical] // auto-generated 
public override void Write(byte[] array, int offset, int count) { 
    if (array==null) 
     throw new ArgumentNullException("array", Environment.GetResourceString("ArgumentNull_Buffer")); 
    if (offset < 0) 
     throw new ArgumentOutOfRangeException("offset", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum")); 
    if (count < 0) 
     throw new ArgumentOutOfRangeException("count", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum")); 
    if (array.Length - offset < count) 
     throw new ArgumentException(Environment.GetResourceString("Argument_InvalidOffLen")); 
5

uint MSDN only

uint प्रकार सीएलएस अनुरूप नहीं है से:

एक बात (शायद असंबंधित) जोड़ने के लिए अधिक, Stream.Write implementation ऋणात्मक मानों के लिए चेक है। जब भी संभव हो int का प्रयोग करें।

तो Stream.Write ऑफ़सेट और गिनती के लिए int का उपयोग करता है।

reasons given by ShuggyCoUk इसे और अधिक स्पष्ट करता है:

  • uint सीएलएस अनुरूप नहीं है, इस प्रकार यह पर एक में प्रकार (सरणी) का निर्माण निर्भर समस्याग्रस्त हो गया होता
  • के रूप में क्रम मूल डिजाइन 2 जीबी मेमोरी की तुलना में पर कब्जा कर रहे ढेर पर किसी ऑब्जेक्ट को प्रतिबंधित करता है। चूंकि अधिकतम आकार वाली सरणी जो से कम या इस सीमा के बराबर होगी, नया बाइट [int.MaxValue] होगा सकारात्मक और अवैध सरणी लंबाई उत्पन्न करने में सक्षम होने के लिए लोगों को परेशान करेगा।
    • ध्यान दें कि यह सीमा somewhat removed in the 4.5 release, है, हालांकि मानक लंबाई int int के रूप में है।
  • ऐतिहासिक रूप से सी # विरासत सी और सी ++ से इसके अधिकांश वाक्यविन्यास और सम्मेलन को प्राप्त करता है। उन सरणी में बस पॉइंटर अंकगणित है इसलिए नकारात्मक सरणी अनुक्रमण संभव था (हालांकि सामान्य रूप से अवैध और खतरनाक)। चूंकि बहुत मौजूदा कोड मानता है कि सरणी सूचकांक ऋणात्मक है यह
  • संबंधित नोट पर सी/सी ++ में सरणी अनुक्रमणिका के लिए हस्ताक्षरित पूर्णांक का उपयोग करने का अर्थ है कि इन भाषाओं और अप्रबंधित कार्यों के साथ इंटरऑप की आवश्यकता होगी वैसे भी उन परिस्थितियों में चींटियों का उपयोग, जो असंगतता के कारण भ्रमित हो सकता है।
  • BinarySearch कार्यान्वयन (कई एल्गोरिदम का एक बहुत ही उपयोगी घटक) में सक्षम होने पर निर्भर करता है को पूर्णांक के नकारात्मक श्रेणी का उपयोग कि मूल्य और स्थान नहीं मिला था, जिस पर इस तरह के एक मूल्य होना चाहिए इंगित करने के लिए को सॉर्टिंग बनाए रखें।
  • किसी सरणी पर परिचालन करते समय यह संभावना है कि आप किसी मौजूदा अनुक्रमणिका का ऋणात्मक ऑफ़सेट लेना चाहते हैं। यदि आपने का उपयोग ऑफ़सेट किया है जो आपको इकाई का उपयोग करके सरणी की शुरुआत से पहले ले जाएगा, तो व्यवहार के आसपास लपेटने से आपकी अनुक्रमणिका संभवतः कानूनी (उसमें यह सकारात्मक है)। एक पूर्णांक के साथ परिणाम (के बाद से क्रम अमान्य स्मृति पढ़ने से बचाव होगा, लेकिन सुरक्षित) अवैध होगा
1

मानो या न मानो, अहस्ताक्षरित पूर्णांकों not part of the Common Language Specification (CLS) हैं।

MSDN entry for uint:

uint प्रकार सीएलएस अनुरूप नहीं है। जब भी संभव हो int का प्रयोग करें।

इस प्रकार माइक्रोसॉफ्ट सीएलएस-compliancy के हित में यहां के बजाय uintint इस्तेमाल किया।

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