सादृश्य से, C # मूल रूप से मैकेनिक के औजारों के एक सेट की तरह है जहां किसी ने पढ़ा है कि आपको आम तौर पर सरौता और समायोज्य खाइयों से बचना चाहिए, इसलिए इसमें समायोज्य रिंच शामिल नहीं हैं, और सरौता एक विशेष दराज में बंद हैं "असुरक्षित" चिह्नित , और केवल आपके स्वास्थ्य के लिए किसी भी जिम्मेदारी के अपने नियोक्ता को अनुपस्थित अस्वीकरण पर हस्ताक्षर करने के बाद, एक पर्यवेक्षक से अनुमोदन के साथ इस्तेमाल किया जा सकता है।
सी ++, तुलना करके, न केवल समायोज्य रिंच और सरौता शामिल हैं, बल्कि कुछ अजीब-बॉल विशेष उद्देश्य उपकरण हैं, जिनका उद्देश्य तुरंत स्पष्ट नहीं है, और यदि आप उन्हें रखने का सही तरीका नहीं जानते हैं, तो वे आसानी से आपका हिस्सा काट सकते हैं अंगूठे (लेकिन एक बार जब आप समझते हैं कि उनका उपयोग कैसे किया जाए, तो वे चीजें कर सकते हैं जो मूल उपकरण C # टूलबॉक्स में अनिवार्य रूप से असंभव हैं)। इसके अलावा, इसमें एक खराद, मिलिंग मशीन, सतह की चक्की, धातु-काटने वाले बैंड-आरा, आदि हैं, जो आपको किसी भी समय आपको डिजाइन करने और पूरी तरह से नए उपकरण बनाने की आवश्यकता महसूस करने के लिए (लेकिन हाँ, उन मशीनों के उपकरण के कारण और हो सकते हैं) गंभीर चोटें अगर आपको नहीं पता कि आप उनके साथ क्या कर रहे हैं - या भले ही आप लापरवाह हो जाएं)।
यह दर्शन में मूल अंतर को दर्शाता है: C ++ आपको उन सभी उपकरणों को देने का प्रयास करता है जो आपको आवश्यक रूप से किसी भी डिजाइन की आवश्यकता हो सकती है। यह नियंत्रित करने का कोई प्रयास नहीं करता है कि आप उन उपकरणों का उपयोग कैसे करते हैं, इसलिए उन डिजाइनों का उपयोग करना भी आसान है जो केवल दुर्लभ परिस्थितियों में अच्छी तरह से काम करते हैं, साथ ही ऐसे डिजाइन जो शायद सिर्फ एक घटिया विचार हैं और किसी को भी ऐसी स्थिति के बारे में नहीं पता है जिसमें वे अच्छी तरह से काम करने की संभावना रखते हैं। विशेष रूप से, इसका एक बड़ा सौदा डिजाइन के फैसलों को डिकम्प्लिंग करके किया जाता है - यहां तक कि उन अभ्यासों में जो वास्तव में लगभग हमेशा युग्मित होते हैं। परिणामस्वरूप, केवल C ++ लिखने और C ++ अच्छी तरह से लिखने के बीच बहुत बड़ा अंतर है। C ++ अच्छी तरह से लिखने के लिए, आपको बहुत सारे मुहावरे और अंगूठे के नियमों को जानने की आवश्यकता है (अंगूठे के अन्य नियमों को तोड़ने के लिए गंभीरता से पुनर्विचार करने के बारे में अंगूठे के नियमों सहित)। नतीजतन, C ++ सीखने में आसानी की तुलना में उपयोग में आसानी (विशेषज्ञों द्वारा) की ओर अधिक उन्मुख है। ऐसी (सभी बहुत सारी) परिस्थितियां भी हैं जिनमें वास्तव में उपयोग करना बहुत आसान नहीं है।
C # बहुत अधिक बल देने की कोशिश करता है (या कम से कम अत्यंत दृढ़ता से सुझाव देता है) कि भाषा डिजाइनर अच्छी डिजाइन प्रथाओं को क्या मानते हैं। काफी कुछ चीजें जिन्हें C ++ में डिकॉय किया गया है (लेकिन आमतौर पर प्रैक्टिस में एक साथ चलते हैं) सीधे C # में युग्मित होते हैं। यह "असुरक्षित" कोड को सीमाओं को थोड़ा धक्का देने की अनुमति देता है, लेकिन ईमानदारी से, पूरी तरह से नहीं।
नतीजा यह है कि एक तरफ काफी कुछ डिजाइन हैं जिन्हें सी ++ में सीधे व्यक्त किया जा सकता है जो सी # में व्यक्त करने के लिए पर्याप्त रूप से अनाड़ी हैं। दूसरी ओर, यह एक है पूरी सी # जानने के लिए बहुत आसान है, और एक बहुत भयानक डिजाइन कि अपनी स्थिति के लिए काम करते है (या शायद किसी अन्य) कर रहे हैं उत्पादन की संभावना काफी कम कर दिया। कई (शायद सबसे अधिक) मामलों में, आप केवल "प्रवाह के साथ जा रहे हैं", इसलिए बोलने के लिए एक ठोस, व्यावहारिक डिजाइन प्राप्त कर सकते हैं। या, मेरे दोस्तों में से एक के रूप में (कम से कम मैं उसे एक दोस्त के रूप में सोचना पसंद करता हूं - निश्चित नहीं कि अगर वह वास्तव में सहमत है) तो इसे लगाना पसंद करता है, सी # सफलता की गर्त में गिरना आसान बनाता है।
इसलिए विशेष रूप से इस सवाल पर कि वे दो भाषाओं में कैसे class
और struct
कैसे हैं: एक विरासत पदानुक्रम में बनाई गई वस्तुएं जहां आप अपने बेस क्लास / इंटरफ़ेस की आड़ में एक व्युत्पन्न वर्ग की वस्तु का उपयोग कर सकते हैं, आप बहुत अधिक हैं इस तथ्य के साथ अटक जाना कि आपको सामान्य रूप से किसी प्रकार के सूचक या संदर्भ के माध्यम से ऐसा करने की आवश्यकता है - एक ठोस स्तर पर, क्या होता है कि व्युत्पन्न वर्ग की वस्तु में कुछ मेमोरी होती है जिसे आधार वर्ग के उदाहरण के रूप में माना जा सकता है / इंटरफ़ेस, और व्युत्पन्न वस्तु को स्मृति के उस हिस्से के पते के माध्यम से हेरफेर किया जाता है।
C ++ में, यह प्रोग्रामर पर निर्भर है कि वह सही ढंग से - जब वह विरासत का उपयोग कर रहा है, तो यह सुनिश्चित करने के लिए उसके ऊपर है कि (उदाहरण के लिए) एक पदानुक्रम में बहुरंगी वर्गों के साथ काम करने वाला एक फ़ंक्शन सूचक या आधार के माध्यम से ऐसा करता है। कक्षा।
C # में, मूल रूप से प्रकारों के बीच एक ही अलगाव अधिक स्पष्ट है, और भाषा द्वारा ही लागू किया जाता है। प्रोग्रामर को संदर्भ द्वारा किसी वर्ग के उदाहरण को पारित करने के लिए कोई कदम उठाने की आवश्यकता नहीं है, क्योंकि यह डिफ़ॉल्ट रूप से होगा।
struct
हमेशा स्टैक पर संग्रहीत नहीं किया जाता है; किसीstruct
फ़ील्ड के साथ ऑब्जेक्ट पर विचार करें । एक तरफ, जैसा कि मेसन व्हीलर ने स्लाइसिंग समस्या का उल्लेख किया है, शायद सबसे बड़ा कारण है।