2010-07-15 6 views
8

सी # का उपयोग करना शुरू करने से पहले मैं ज्यादातर सी/सी ++ पृष्ठभूमि से आया था। चीजें मैं सी # में मेरी पहली परियोजना के साथ किया था में से एक था बनाने के इससी # में हस्ताक्षर किए गए सीएलआर प्रकारों का उपयोग क्यों करना मुश्किल है?

class Element{ 
    public uint Size; 
    public ulong BigThing; 
} 

मैं तो तथ्य यह है कि इस आवश्यकता से अपमानित किया गया था की तरह एक वर्ग कास्टिंग: करता

int x=MyElement.Size; 

रूप

int x=5; 
uint total=MyElement.Size+x; 

भाषा डिजाइनरों ने हस्ताक्षरित और हस्ताक्षरित पूर्णांक प्रकारों को निश्चित रूप से कास्ट करने का निर्णय क्यों नहीं लिया? और .NET लाइब्रेरी में बिना हस्ताक्षर किए गए प्रकारों का अधिक उपयोग क्यों किया जाता है? उदाहरण के लिए String.Length नकारात्मक कभी नहीं हो सकता है, फिर भी यह एक हस्ताक्षरित पूर्णांक है।

+1

सी ++ में भी हस्ताक्षर किए गए हस्ताक्षर किए गए या पीछे से एक कास्ट चेतावनी का कारण बनता है। –

+0

@ सेव कंपाइलर के आधार पर: पी .. मुझे एहसास है कि मेरा पहला मामला कमजोर है, लेकिन मेरा दूसरा मामला वास्तव में और अधिक है जिसका मतलब है क्योंकि वहां डेटा हानि का कोई मौका नहीं है जब तक कि 'x' नकारात्मक – Earlz

+0

दूसरी गणना पर , नीचे मेरी प्रतिक्रिया देखें ... –

उत्तर

18

क्यों भाषा डिजाइनरों परोक्ष castable पर हस्ताक्षर किए और अहस्ताक्षरित पूर्णांक प्रकार बनाने का निर्णय नहीं किया है?

क्योंकि कि डेटा खो या किसी अपवाद हैं, जिनमें से न तो आम तौर पर परोक्ष अनुमति देने के लिए एक अच्छी बात है फेंक सकता है।

और क्यों अहस्ताक्षरित प्रकार के होते हैं और अधिक नेट पुस्तकालय का उपयोग नहीं (लंबी से अंतर्निहित रूपांतरण दोगुना करने के लिए डेटा भी, बेशक, लेकिन एक अलग तरीके से। खो सकते हैं)

अहस्ताक्षरित प्रकार सीएलएस-अनुरूप नहीं हैं - सभी .NET भाषाओं ने हमेशा उनका समर्थन नहीं किया है। उदाहरण के लिए, विजुअल बेसिक में .NET 1.0 और 1.1 में हस्ताक्षरित डेटा प्रकारों के लिए "मूल" समर्थन नहीं था; इसे 2.0 के लिए भाषा में जोड़ा गया था। (आप अभी भी उनका उपयोग कर सकते थे, लेकिन वे भाषा का हिस्सा नहीं थे - उदाहरण के लिए आप सामान्य अंकगणितीय ऑपरेटरों का उपयोग नहीं कर सके।)

+3

"हालांकि मैं गलत हो सकता था" - आपका मतलब है .NET गलत हो सकता था? – PostMan

+0

@ पोस्टमैन: मुझे अभी कुछ और जानकारी मिली है ... संपादित करेंगे। –

1

क्योंकि 3 बी के एक हस्ताक्षरित पूर्णांक को एक हस्ताक्षरित पूर्णांक में परिवर्तित करने के लिए जा रहा है उकसाना।

असाइन किए गए हस्ताक्षर के अधिकतम मूल्य से दोगुना है। यही कारण है कि आप एक int के लिए लंबे समय तक नहीं डाला जा सकता है।

+0

क्या कोई प्रतिष्ठा पूर्ण करने के लिए पर्याप्त प्रतिष्ठा वाला है जिसे "हस्ताक्षरित पूर्णांक में 3 बी के हस्ताक्षरित पूर्णांक" कहने के लिए कहा जा सकता है? उनका इरादा स्पष्ट था, सिर्फ एक टाइपो। –

+0

धन्यवाद डेव, मैंने इसे फिर से पढ़ा और इसे याद किया: x –

4

जॉन के जवाब के साथ साथ, सिर्फ इसलिए कि एक अहस्ताक्षरित संख्या ऋणात्मक यह मतलब नहीं है नहीं किया जा सकता एक हस्ताक्षरित एक से भी बड़ा नहीं है। uint 0 से 4,294,967,295 है लेकिन int -2,147,483,648 से 2,147,483,647 है। int के नुकसान के लिए अधिकतम कमरे के बहुत सारे।

0

दूसरा गिनती पर: क्योंकि वे CLR भाषाओं अहस्ताक्षरित डेटाटाइप्स की जरूरत नहीं है कि के साथ संगत होना चाहता था (पढ़ें: VB.NET)।

+0

वीबीनेट के पास कम से कम 2.0 के बाद से हस्ताक्षरित संख्याएं हैं। मुझे पता नहीं था कि वे पहले गायब हैं, लेकिन इससे बहुत समझ आएगी - वे सीएलएस में इसे बनाने के लिए वीबी में नहीं थे। – cHao

+0

लेकिन .NET v2 में स्ट्रिंग क्लास को बदलना (या, उस मामले के लिए, कभी भी) कोड की एक बड़ी मात्रा तोड़ देगा। –

1

मैं तो इस बात से अपमानित किया गया था कि इस कास्टिंग की आवश्यकता है:

int x=MyElement.Size; 

लेकिन आप अपने आप को यहाँ का खंडन कर रहे हैं। यदि आपको वास्तव में (वास्तव में) आवश्यकता है तो इसे हस्ताक्षरित करने के लिए आकार (हस्ताक्षरित) x को एक त्रुटि है। आपके कोड में एक गहरी खामियां।

उदाहरण स्ट्रिंग के लिए

।लंबाई नकारात्मक कभी नहीं हो सकता, फिर भी यह एक हस्ताक्षरित पूर्णांक

है लेकिन String.IndexOf एक ऋणात्मक संख्या लौट सकते हैं, और यह अजीब हो सकता है अगर String.Length और सूचकांक मूल्य जहां विभिन्न प्रकार के।

और सिद्धांत में जबकि एक हस्ताक्षरित स्ट्रिंग। लम्बाई (4 जीबी कैप) में योग्यता होगी, अभ्यास में भी वर्तमान 2 जीबी पर्याप्त है (क्योंकि उस लंबाई के तार दुर्लभ और अनावश्यक हैं)।

तो असली जवाब है: क्यों पहले स्थान पर हस्ताक्षर किए गए का उपयोग करें?

+0

अच्छा, क्योंकि यह हस्ताक्षरित संख्याओं की विस्तृत अभिव्यक्ति की अनुमति देता है? –

+0

@ हेंक: मुझे लगता है कि 'int' का उपयोग करने का एक बेहतर उदाहरण अराजक है' ऐरे। लम्बाई '। कोई भी किसी सरणी को ऋणात्मक आकार की उम्मीद नहीं करेगा, और एक हस्ताक्षरित प्रकार का उपयोग करके ऐरे के (रिपोर्ट किए गए) आकार को 2 जीबी से कम तक सीमित कर देगा। इसके अलावा, सरणी सूचकांक कभी नकारात्मक नहीं हो सकता है। अब दिया गया है, 'लांग लम्बाई' संपत्ति है जो सरणी आकार को 'Int64' के रूप में रिपोर्ट करती है - लेकिन यह अभी भी इसे एक हस्ताक्षरित मान के रूप में रिपोर्ट करती है। इन मामलों में ओवरराइडिंग विचार यह तथ्य है कि .NET के डिजाइनरों ने गैर-सीएलएस अनुपालन रहित हस्ताक्षर किए। ऐसा कुछ जो इस बिंदु पर कभी भी बदलने की संभावना नहीं है। – LBushkin

+0

@ पॉल: 'दशमलव' की एक विस्तृत श्रृंखला भी है। सवाल अपरिपक्व के _practical_ उपयोगों के लिए है। ओपी ने कोई भी प्रदान नहीं किया है। –