2013-01-13 50 views
8
public struct Unit 
{ 
    Unit u; 
} 

कारणों:सी # में कक्षाओं के लिए कोई चक्रीय लेआउट मुद्दा क्यों नहीं है?

Struct सदस्य प्रकार 'इकाई' के 'Unit.u' struct लेआउट में एक चक्र का कारण बनता है।

लेकिन

public class Unit 
{ 
    Unit u; 
} 

संकलित करता है। मुझे लगता है कि समस्या मुझे समझ में आता है। Unit ऑब्जेक्ट का संदर्भ देते समय एक अंतहीन चक्र बनाया जाएगा क्योंकि इसे किसी अन्य सदस्य Unit और अन्य को प्रारंभ करना होगा। लेकिन संकलक केवल structs के लिए समस्या को प्रतिबंधित क्यों करता है? क्या समस्या class के लिए भी जारी नहीं है? क्या मैं कुछ भूल रहा हूँ?

उत्तर

20

समस्या लेआउट के संदर्भ में है।

Unit एक संरचना है, Unit के लिए कोई भी मूल्य उसी प्रकार (और इस प्रकार एक ही आकार), विज्ञापन infinitum का एक और मूल्य होना होगा। यह असंभव है। मुझे लगता है कि आप तर्क दे सकते हैं कि Unit के लिए फ़ील्ड को कोई मेमोरी नहीं लेनी चाहिए, इसलिए में यह स्वयं ही शामिल हो सकता है - लेकिन मेरा मानना ​​है कि सीएलआर काम करता है कि सभी structs कम से कम 1 बाइट लेते हैं। ..

जब Unit एक वर्ग है, एक Unit वस्तु केवल एक और Unit ऑब्जेक्ट में एक संदर्भ को रोकने के लिए है। कोई भंडारण समस्या नहीं है, और मूल्य शुरू करने के लिए शून्य हो सकता है।

इस बारे में सोचें: आपके पास एक ऐसा घर नहीं हो सकता जिसमें एक ही ब्लूप्रिंट से बनाया गया एक और घर हो, लेकिन आप निश्चित रूप से एक घर ले सकते हैं जिसमें पेपर का टुकड़ा उस पर एक समान घर के पते के साथ है ...

+0

ओह यह सही है। दीन सोचते हैं कि .. धन्यवाद। – nawfal

+0

@ जोन, घर का उदाहरण वास्तव में बहुत अच्छा है! :) – nawfal

+1

आखिरी बिट में संक्षेप में समझाया गया। +1 –

3

कक्षाएं संदर्भ प्रकार हैं, इसलिए मुझे लगता है कि अंतर यह है कि class उदाहरण में, इसे केवल किसी अन्य उदाहरण के संदर्भ को सहेजना है। आपके struct के लिए, एक मान प्रकार, इसमें पूरी संरचना को फिर से शामिल करने की आवश्यकता होगी, इसलिए एक अनंत लूप।

1

क्योंकि Structvalue type हैं। Unit मूल्य को अपने रूप में ही पकड़ सकता है? मुझे लगता है कि यह सकारात्मक नहीं है।

लेकिन जब Unitclass है, classreference type हैं। Unit ऑब्जेक्ट संदर्भ को Unit ऑब्जेक्ट पर रख सकता है। बस ठीक है।

2

struct स्वचालित रूप से, एक मूल्य के साथ आरंभ नहीं हो जाता तो अपने उदाहरण में एक Unit मूल्य एक Unit मूल्य है, जो एक Unit मूल्य है, जो एक Unit मान, आदि शामिल होते हैं ... केवल

आपका class उदाहरण initializes null का संदर्भ, जिसमें अनंत असीमितता नहीं है।यदि आप निम्न किया आप उनका लेकिन एक ऐसी ही समस्या का सामना करेंगे:

class Unit 
{ 
    Unit mUnit = new Unit(); 
} 

अब, निर्माण एक Unit निर्माण करती है एक Unit है, जो एक Unit आदि का निर्माण करती है, ... इस मामले में, आप एक क्रम ढेर अतिप्रवाह अपवाद का सामना करेंगे यदि आप Unit ऑब्जेक्ट को तुरंत चालू करने का प्रयास करते हैं।

मैंने सोचा था कि आप एक शून्य प्रकार का उपयोग कर struct समस्या से बचने में सक्षम हो सकते हैं, लेकिन समस्या बनी हुई है। मेरा मानना ​​है कि यह इस तथ्य के कारण है कि null पर सेट होने पर एक शून्य struct अभी भी तत्काल है।

+1

आपकी धारणाएं वास्तव में गलत हैं। संपादित करें। पहले के साथ मेरा मतलब है कि कोई संकलन समय चेतावनी नहीं है जैसे कि structs के लिए। – nawfal

+0

@nawfal क्या आप अधिक विशिष्ट हो सकते हैं? –

+0

मैंने यह नहीं कहा कि आपको एक संकलन समय चेतावनी मिलेगी, मैंने कहा था कि आपको एक स्टैक ओवरफ़्लो मिलेगा, जो आप करते हैं। –