2010-01-06 7 views
61

मैंने अभी एक कक्षा को लागू करने की कोशिश की है जहां कई लंबाई/गिनती गुण इत्यादि uintint के बजाय हैं। हालांकि, ऐसा करने पर मैंने देखा कि यह वास्तव में ऐसा करने में दर्दनाक है, जैसे कि कोई भी वास्तव में ऐसा नहीं करना चाहता।क्या मुझे उन मूल्यों के लिए सी # में यूंट का उपयोग करना चाहिए जो नकारात्मक नहीं हो सकते हैं?

लगभग सभी चीजें जो एक अभिन्न प्रकार को सौंपती हैं, int लौटाती है, इसलिए कई बिंदुओं में होने की आवश्यकता होती है। मैं StringBuffer बनाना चाहता था, जिसमें बफर की लंबाई उस वर्ग के फ़ील्ड में से एक के लिए डिफॉल्ट हो गई थी। एक कास्ट भी आवश्यक है।

तो मुझे आश्चर्य हुआ कि मुझे बस int पर वापस जाना चाहिए या नहीं। मैं निश्चित रूप से पूरी श्रृंखला का उपयोग नहीं कर रहा हूँ। मैंने सोचा कि मैं वहां से क्या कर रहा हूं बस नकारात्मक नहीं हो सकता है (यदि यह था, तो यह एक त्रुटि होगी) वास्तव में uint का उपयोग करना एक अच्छा विचार होगा।

पी.एस .: मैं this question को देखा और इस कम से कम बताता है कि क्यों ढांचा ही हमेशा int का उपयोग करता है लेकिन फिर भी स्वयं के कोड में यह uint जो मुझे लगता है कि यह जाहिरा तौर पर वास्तव में चाहता था नहीं है बनाता है से चिपक वास्तव में बोझिल है।

+0

यह भी देखें [क्यों-नेट-यूज-इन-निश्चित-कक्षाओं के बजाय-क्यों-नेट-यूज-इन-निश्चित-कक्षाएं) (http://stackoverflow.com/questions/782629/why-does-net-use-int -इस्टेड-ऑफ-यूंट-इन-निश्चित-कक्षाएं) – nawfal

उत्तर

36

सख्ती से आपको uint का उपयोग उन चर के लिए करना चाहिए जो गैर-ऋणात्मक पूर्णांक धारण करते हैं, आप कारणों में से एक बार आते हैं कि यह हमेशा व्यावहारिक नहीं होता है।

इस मामले में मुझे नहीं लगता कि पढ़ने के साथ आने वाली पठनीयता में कमी इसके लायक है।

+2

यह कहना मुश्किल है, मुझे नहीं लगता कि कास्ट सिर्फ इंडेक्सरों के लिए बहुत ही कम क्षमता को कम करता है और आप एक रैपर बना सकते हैं। और नकारात्मक जो नकारात्मक हो जाते हैं वे दर्दनाक और महंगी बग हैं। – user1496062

+3

यदि आपको किसी int के लिए एक रैपर बनाना है तो आपके पास पठनीयता समस्याओं से अधिक है :) – Sam

3

मेरी व्यक्तिगत भावना यह है कि आपको शायद int में रहना चाहिए। एक संख्यात्मक सीमा को पुनः प्राप्त करने के लिए बस प्रत्येक एकल संपत्ति पहुंच में बहुत अधिक कलाकारों के लिए एक कलाकार जोड़ने के लायक नहीं है, जो कि .NET की किसी भी तरह से आपको उपयोग करने की संभावना नहीं है।

4

एक नकारात्मक मान अक्सर त्रुटि की स्थिति को सिग्नल करने के लिए उपयोग किया जाता है, और एक ऑपरेशन का आकार अक्सर फ़ंक्शन कॉल द्वारा वापस किया जाता है; एक नकारात्मक मान इसलिए अपवाद तंत्र का उपयोग किए बिना त्रुटि सिग्नल कर सकता है।

यह भी ध्यान रखें कि .NET अक्सर सी सी पुस्तकालयों पर बनाता है, इसलिए इस सम्मेलन को जारी रखना समझदारी है। यदि आपको एक बड़ी इंडेक्स स्पेस की आवश्यकता है तो आप विभिन्न त्रुटि सिग्नलिंग तंत्र के लिए सम्मेलन तोड़ सकते हैं।

+19

.NET के त्रुटि कोड लौटने के बजाय अपवाद फेंकने के साथ काफी सुसंगत है। -1 वापसी प्रबंधित कोड में एक आम दृष्टि नहीं है। – ChrisV

+0

सहमति है, लेकिन हम एक डिजाइन परंपरा है कि (जहां वे समर्थन कर रहे अपवादों के अलावा) खिड़कियों प्रौद्योगिकियों भर में प्रचलित है के बारे में बात कर रहे हैं - नेट पुस्तकालय के उन हिस्सों कि निम्न स्तर कोड के साथ इंटरफेस सीआरटी त्रुटि कोड और के बीच अनुवाद करने के लिए है अपवाद - यह समझने योग्य है कि वे इंट के बजाए इंट के सम्मेलन को आगे क्यों लाते हैं। –

1

यदि आप यह देखना चाहते हैं कि कोई मान सकारात्मक है, तो शायद एक बेहतर तरीका शायद जोर से उपयोग करके (ध्यान दें कि यह केवल एक डिबगिंग तकनीक है - आपको यह सुनिश्चित करना चाहिए कि यह अंतिम कोड में कभी नहीं होता)।

using System.Diagnostics; 
... 
Debug.Assert (i > 0); 
3

इंट का उपयोग करना संचालन में पूर्णांक ओवरफ़्लो का पता लगाने में सहायक होता है।

50

मैं अन्य उत्तरों में भी जोड़ूंगा कि सार्वजनिक क्षेत्र, संपत्ति, विधि, पैरामीटर आदि के रूप में यूंट का उपयोग करना सामान्य भाषा विशिष्टता नियमों का उल्लंघन है और जब संभव हो तो इससे बचा जा सकता है।

+2

और माइक्रोसॉफ्ट ने मुझे सख्ती से पालन करके जला दिया। यह पता चला है कि IntPtr एक यूआईटी कन्स्ट्रक्टर होना चाहिए था। – Joshua

+1

मैं यह भी जोड़ूंगा कि क्या उन्होंने प्राकृतिक संख्याओं का समर्थन किया है, उदाहरण के लिए यह प्रकार 0 से 6 मान है, वे सभी सरणी सीमाओं को जांचने में 5-10% प्रदर्शन को बढ़ावा दे सकते हैं। – user1496062

3

आईएमओ, uint का उपयोग करने की कमी यह है कि यह त्रुटि की स्थिति को अस्पष्ट करता है। निम्नलिखित कोड के समकक्ष के रूप में अच्छा नहीं कर रहे हैं:

if (len < 0) 
    terminate_program("length attained impossible value."); 

बेशक अपने कार्यक्रम कुछ भी साथ शुरू अशुद्ध गणना नहीं करना चाहिए, लेकिन मैं वे भी तेजी से प्रसार के बिना संख्यात्मक मिली त्रुटियाँ पता लगाने के लिए लिखा जाना चाहिए लग रहा है।इस मामले में जहां 2^31 की एक MAXVALUE पर्याप्त है में, मैं System.Diagnostics.Debug.Assert() के समुचित उपयोग और इसके बाद के संस्करण का एक उदाहरण प्रस्तुत संबंधित त्रुटि-जांच के साथ-साथ उपयोग int का कहना है।

यदि आप uint का उपयोग करते हैं तो इसे checked के साथ अंडरफ्लो को रोकने और उसी परिणाम प्राप्त करने के लिए इसका उपयोग करें। हालांकि मुझे पता चला है कि मौजूदा कोड पर लागू करने के लिए चेक थोड़ा मुश्किल है जो किसी उद्देश्य के लिए उपयोग करता है।

1

यदि आपको ऐसा करने की ज़रूरत नहीं है तो अपस्ट्रीम तैरें मत। कास्ट के साथ अपना कोड लीटर नहीं करना आपके कोड को और अधिक पठनीय बनाता है। इसके अलावा, यदि आपके संभावित मूल्य एक int के भीतर फिट होते हैं, तो एक int का उपयोग करना कोई समस्या नहीं है।

यदि आप डरते हैं तो आप एक int को बह सकते हैं, फिर हर तरह से .. लेकिन समय-समय पर अनुकूलन न करें।

मैं कहूंगा कि न्यूनतम को कम करने की बेहतर पठनीयता int का उपयोग करने के साथ एक बग के थोड़ा ऊंचा जोखिम से अधिक है।

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