2011-01-19 15 views
10

मेरे प्रश्न हैं:सी # में, बनाम संदर्भ प्रकार मूल्य प्रकार के उपयोग

  • हम मूल्य प्रकार और जब संदर्भ प्रकार जब इस्तेमाल करना चाहिए?
  • एक दूसरे के फायदे और नुकसान क्या हैं?
  • यदि कोई संदर्भ संदर्भ प्रकारों का उपयोग करता है तो क्या होगा? क्या इसमें कोई नुकसान है?

कृपया प्रत्येक के फायदे और नुकसान पर भी चर्चा करें। मैं भी इसे समझना चाहता हूं।

+2

यदि आप तय नहीं कर सकते हैं, तो यह लगभग निश्चित रूप से 'कक्षा' है। यह वैध रूप से * एक संरचना लिखने के लिए अविश्वसनीय रूप से दुर्लभ है। –

+1

तुर्की प्रोग्रामर के लिए, मेरे पास इसके बारे में एक ब्लॉग पोस्ट है http://sonergonul.net/2012/12/net-icerisinde-deger-tipi-ve-referans-tipi/ –

उत्तर

4

इस पर बहुत भ्रम प्रतीत होता है, और जॉन स्कीट अपनी पुस्तक "सी # इन गहराई, द्वितीय एड" में इसे साफ़ करने का अच्छा काम करता है। (सेक्शन 2.3)।

मेरा व्यक्तिगत दृष्टिकोण, जो सही हो सकता है या नहीं भी हो सकता है, केवल हल्के, परमाणु डेटा संरचनाओं का प्रतिनिधित्व करने के लिए structs/enumerations (मान प्रकार) का उपयोग करना है जो मुझे पता है कि मैं अक्सर किसी प्रकार के तार्किक या गणितीय में उपयोग करूँगा संचालन - Point, आदि

इस तरह से मुझे लगता है कि मैं कचरा संग्रहण प्रदर्शन जुर्माना से बच सकता हूं। हालांकि, जॉन अपनी पुस्तक के उस खंड में बताते हैं कि विशेष रूप से रनटाइम के नए संस्करणों में कोई वास्तविक गारंटी नहीं है, चाहे कुछ भी ढेर पर जाए।

तो मेरा सबसे अच्छा जवाब स्ट्रक्चर की तरह चीजों का उपयोग करना है और यदि आप ऐसा करते हैं तो आप उनका उपयोग क्यों कर रहे हैं, इस बारे में बहुत सचेत रहें। समयपूर्व अनुकूलन के लिए देखें। और यदि आप एक प्रतिलिपि पर अपना हाथ प्राप्त कर सकते हैं तो जॉन की पुस्तक में उस अनुभाग को पढ़ें, क्योंकि वह इस पूरे विषय को स्पष्ट करने का अच्छा काम करता है।

संबंधित: When to use struct?

7

अपरिवर्तनीय के लिए मूल्य प्रकारों का उपयोग करें जिनके पास अपनी पहचान नहीं है (1 एक 1 है), अन्य चीजों के लिए संदर्भ प्रकार का उपयोग करें।

+5

तारों की पहचान होनी चाहिए? :) –

+0

तो एक '" 1 "' '" 1 "' नहीं है? – jason

+0

@ जोन - विशेष मामला ... और कोई तर्क दे सकता है कि तारों को मूल्य प्रकार के रूप में लागू किया जाना चाहिए था। इस पर अपना ध्यान सुनना अच्छा लगेगा। – Oded

9

आपको छोटे, अपरिवर्तनीय प्रकारों के मान मूल्यों का प्रतिनिधित्व करना चाहिए जो मूल्यों का प्रतिनिधित्व करते हैं।
Never make mutable structs

अन्य सभी के लिए, संदर्भ प्रकारों का उपयोग करें।

+1

+1 * छोटे * पर जोर देने के साथ। (कॉपी-ऑन-असाइनमेंट) –

+1

आपकी पोस्ट यह नहीं बताती है कि किसी को मूल्य प्रकारों का उपयोग क्यों करना चाहिए? – Nawaz

2

http://www.albahari.com/valuevsreftypes.aspx

इस इस मुद्दे पर मेरे संदर्भ है। मैं मुख्य रूप से संदर्भ प्रकार टीबीएच का उपयोग करता हूं। आईई कक्षाएं और structs नहीं। मुख्य बिंदु जो अक्सर कहा जाता है वह यह है कि structs केवल जानकारी के छोटे टुकड़ों के लिए इस्तेमाल किया जाना चाहिए। वास्तव में सटीक परिस्थितियों पर निर्भर करता है। ऑब्जेक्ट ब्राउज़र में .NET Framework पर एक नज़र डालें, जो मदद करनी चाहिए, आप देखेंगे कि माइक्रोसॉफ्ट के लोगों ने क्या किया है और आप विश्लेषण कर सकते हैं कि उन्होंने कुछ वर्ग और structs क्यों बनाए।

1

अपरिवर्तनीय मूल्य प्रकार और अपरिवर्तनीय संदर्भ प्रकार शब्दार्थ सभी लेकिन समान हैं; केवल अंतर यह है कि संदर्भ प्रकार समर्थन संदर्भ समानता जांच जो अर्थपूर्ण हो सकता है या नहीं भी हो सकता है, और उस मान प्रकार को एक नालीबल (टी में) में लपेटा जा सकता है जबकि संदर्भ प्रकार निहित रूप से शून्य होते हैं। यदि एक प्रकार अपरिवर्तनीय होने जा रहा है, इस पर निर्भर करता है कि इसका उपयोग कैसे किया जाएगा, संरचना या कक्षा के पक्ष में प्रदर्शन कारण हो सकते हैं; कुछ संचालन (लगभग सभी संचालन, चार बाइट से कम आकार के लिए) के लिए structs तेजी से होते हैं, जबकि कुछ अन्य लोगों के लिए कक्षाएं तेजी से बढ़ सकती हैं (विशेष रूप से 16 बाइट से बड़ी चीजों के लिए)। इसके अलावा, कुछ प्रकार के संचालन अनिवार्य रूप से structs के साथ असंभव हैं।

म्यूटेबल स्ट्रक्चर प्रकार उपयोगी हैं, कुछ नायकों का दावा करने के विपरीत, लेकिन कुछ चेतावनी हैं। यदि किसी के पास एक वेरिएबल है जो एक म्यूटेबल क्लास ऑब्जेक्ट का संदर्भ रखता है, और कोई उस ऑब्जेक्ट को बदलने के लिए कुछ करता है, तो वह परिवर्तन प्रभावी रूप से उस ऑब्जेक्ट का संदर्भ रखने वाले सभी चीज़ों द्वारा "देखा" जाएगा। अगर कोई किसी और चीज को परेशान किए बिना किसी वस्तु को बदलना चाहता है, तो उसे पता होना चाहिए कि उस वस्तु का एकमात्र संदर्भ है। अक्सर बार-बार यह सुनिश्चित करने का एकमात्र तरीका ऑब्जेक्ट से सभी डेटा को एक नए ऑब्जेक्ट इंस्टेंस में कॉपी करना है, और उसके बाद उस नए इंस्टेंस में परिवर्तन करना है। इसके विपरीत, अगर किसी के पास एक परिवर्तनीय संरचना है, तो कोई भी नया उदाहरण बनाने के बिना जो कुछ भी चाहता है उसे आसानी से कर सकता है।

उत्परिवर्तनीय structs के साथ एकमात्र असली समस्या यह है कि .net एकीकृत प्रकार प्रणाली के हिस्से के रूप में व्यवहार करने के लिए विभिन्न abstractions का उपयोग करता है, और इन abstractions संरचनाओं की प्रतियों का उपयोग उन जगहों पर किया जा सकता है जहां मूल रूप से मूल रूप से उपयोग किया जाना चाहिए । यह हमेशा स्पष्ट नहीं होता है जब ये प्रतिस्थापन हो सकते हैं, और वे भ्रमित और ग़लत व्यवहार कर सकते हैं।