2012-10-09 10 views
11

क्यों सी # में मेरे दो चर अलग-अलग डेटटाइम ऑब्जेक्ट्स को इंगित करते हैं?सी # डेटटाइम हमेशा नई वस्तु बनाते हैं?

DateTime a1 = DateTime.Now; 
DateTime a2 = a1; 

a1 = a1 + TimeSpan.FromMinutes(15); 
a2 = a2 - TimeSpan.FromMinutes(16); 

मुझे एहसास हुआ कि ए 2 वास्तव में एक नई वस्तु को इंगित करता है जो ए 1 से अलग है।

लेकिन दूसरे मामले में। मान लें कि मेरे पास एक क्लास व्यक्ति है, और आयु = 1;

Person a1 = new Person(); 
a2 = a1; 
a2 = Person.Age = 2; 

व्यक्ति मामले में, ए 1 और ए 2 एक ही वस्तु को इंगित कर रहे हैं। मैं वास्तव में यहां उलझन में हूं, कोई भी समझा सकता है?

+2

दिनांक समय एक मान प्रकार, नहीं एक संदर्भ प्रकार –

+1

चेक इस जवाब है http://stackoverflow.com/a/4265417/1511796 –

उत्तर

23

DateTime एक मूल्य प्रकार है - एक संरचना।

मूल्य प्रकार के साथ

, जब आप की तरह कुछ कार्य करें:

DateTime a2 = a1; 

a2a1 के मूल्यों का एक प्रतिलिपि हो जाता है। यह एक ही स्मृति स्थान के समान संदर्भ नहीं है, लेकिन एक पूर्ण, अलग प्रतिलिपि है।

दूसरी ओर, Person एक संदर्भ प्रकार है - एक वर्ग।

जब आप ऐसा करेंगे:

Person p2 = p1; 
एक संदर्भ प्रकार के साथ

, संदर्भ p2 अंक के लिए एक ही एक है कि p1 अंक करने के लिए है कि। तो एक में परिवर्तन दोनों में परिवर्तन हैं।

एमएसडीएन पर Value Types and Reference Types देखें।

+0

अगर मैं गलत नहीं हूँ दिनांक समय अपरिवर्तनीय है। मैं वास्तव में एक भ्रम में हूँ। अपरिवर्तनीय में स्ट्रिंग भी है लेकिन यह संदर्भ प्रकार है। मैं पूछना चाहता हूं कि यह एक अपरिवर्तनीयता के लिए प्रभाव नहीं है कि वास्तव में किस प्रकार का है? मैं आपके उत्तर धन्यवाद की सराहना करता हूं। –

+1

@ नोमीएली - फिर सवाल क्यों नहीं पोस्ट करें? मूल्य प्रकार आमतौर पर अपरिवर्तनीय के रूप में बनाए जाते हैं (और यह उनके अर्थशास्त्र को अच्छी तरह से फिट करता है)। 'स्ट्रिंग' को कई अलग-अलग कारणों से अपरिवर्तनीय के रूप में बनाया गया था (ऑप्टिमाइज़ेशन एक है)। आप अपरिवर्तनीय मूल्य या संदर्भ प्रकार बना सकते हैं। – Oded

3

यहां अंतर यह है कि डेटटाइम एक मान प्रकार है, और मुझे लगता है कि व्यक्ति एक संदर्भ प्रकार (वर्ग) है।

किसी मान प्रकार के परिवर्तनीय असाइनमेंट के मामले में, आप वास्तव में स्मृति की सामग्री को एक स्थान से दूसरे स्थान पर कॉपी कर रहे हैं।

हालांकि, संदर्भ प्रकार के मामले में, आप अभी भी स्मृति के उसी टुकड़े पर इशारा कर रहे हैं।

3

यहां काम पर दो अलग-अलग अवधारणाएं हैं। पहला यह है कि DateTime एक मान प्रकार (ए.के.ए. एक संरचना) है जबकि Person [अनुमानतः] एक संदर्भ प्रकार (एक वर्ग) है। इस वजह से, जब आप कार्य करें:

DateTime date1 = DateTime.Now; 
DateTime date2 = date1; 

date2 मूल्य को कॉपी में परिणाम होगा, तो दो चर एक ही वस्तु को संदर्भित नहीं होगा।

वर्गों के साथ

, जब आप कार्य करें:

Person p1 = new Person(); 
Person p2 = p1; 

p1 वास्तव में एक Person शामिल नहीं है, यह सिर्फ एक व्यक्ति करने के लिए एक संदर्भ है। उस संदर्भ को तब कॉपी किया जाता है (मान द्वारा) p2 पर। उस संदर्भ की प्रतिलिपि बनाने का प्रभाव यह है कि दोनों चर अब एक ही ऑब्जेक्ट को "इंगित करने" या "संदर्भ" कर रहे हैं।

आगे उत्परिवर्तन का मुद्दा है।Person, इस मामले में, एक परिवर्तनीय प्रकार है। इसका मतलब है कि इसे बदला जा सकता है। एक बार निर्माण के बाद दूसरी ओर एक अपरिवर्तनीय प्रकार बदला नहीं जा सकता है।

लाइन:

p2.Age = 2; 

वास्तव में वस्तु p2 संदर्भ, और p2 और p1 के बाद से दोनों का संदर्भ है कि एक ही वस्तु से बदल रहा है, p1.Age2 कोड की है कि रेखा के बाद किया जाएगा।

अब, प्रदर्शन के उद्देश्य से, चलो एक अपरिवर्तनीय Person वर्ग बनाते हैं:

Person p1 = new Person(1); 
Person p2 = p1; 
p2 = p2.Grow(); 

दूसरी पंक्ति बस कर रही है जिस पर वह पहले था, यह सुनिश्चित:

public class Person 
{ 
    private int _age; 
    public Person(int someAge) 
    { 
     _age = someAge; 
    } 

    public int Age 
    { 
     get { return _age; } 
    } 

    public Person Grow() 
    { 
     return new Person(_age + 1); 
    } 
} 

हम कुछ इस तरह करते हैं कि दोनों एक ही वस्तु को इंगित करते हैं, लेकिन तीसरी पंक्ति अलग है। उस व्यक्ति को सालाना पुराना बनाने के लिए उस व्यक्ति को बदलने (या उत्परिवर्तन) करने के बजाय, हमारे Grow विधि एक नया Person ऑब्जेक्ट देता है जो किसी एक वर्ष का प्रतिनिधित्व करता है। ऐसा करने के बाद p2 और p1 अब एक ही ऑब्जेक्ट का संदर्भ नहीं दे रहे हैं; मैंने अभी बदल दिया है p2 एक नया एक संदर्भ जो Grow विधि अभी बनाया गया है।

यह दूसरा उदाहरण DateTime के साथ क्या चल रहा है इसके समान है। आप DateTime ऑब्जेक्ट को म्यूटेट नहीं कर सकते; यह अपरिवर्तनीय है। इसकी विधियों को कॉल करना (इस मामले में प्लस और माइनस ऑपरेटर) रिटर्न और पूरी तरह से नई वस्तु। सम्मेलन के अनुसार, कुछ प्रकार के अनिवार्य कारणों के बिना मूल्य प्रकारों को उत्परिवर्तनीय नहीं होना चाहिए, क्योंकि अक्सर उनके साथ निपटने में मुश्किल हो सकती है। संदर्भ प्रकार या तो अपरिवर्तनीय या परिवर्तनीय हो सकते हैं; न तो महत्वपूर्ण समस्याएं हैं (सामान्य मामले में)।

4

जैसा कि अन्य ने पहले से ही DateTime को इंगित किया है, एक वर्ग है, इसलिए एक वर्ग प्रकार नहीं है। यदि आप structs प्रदर्शित करने के लिए उपयोग किए गए टेक्स्ट रंग को बदलते हैं, तो आप इसे विजुअल स्टूडियो एडिटर में देख सकते हैं। मेनू Tools>Options में संवाद खोलें और नेविगेट Environment

enter image description here

करने के लिए>Fonts and Colors

यह प्रतिनिधियों, enums, इंटरफेस और structs (मूल्य प्रकार) का रंग बदलने के लिए सहायक है।

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