यह एक बहुत अच्छा प्रश्न है, जैसा कि मैंने कई C ++ डेवलपर्स को भयानक C # कोड लिखते देखा है।
सी # के रूप में "सी ++ के साथ अच्छे सिंटैक्स" के बारे में नहीं सोचना सबसे अच्छा है। वे अलग-अलग भाषाएं हैं जिन्हें आपकी सोच में अलग दृष्टिकोण की आवश्यकता होती है। C ++ आपको लगातार सोचने पर मजबूर करता है कि CPU और मेमोरी क्या कर रहे हैं। C # ऐसा नहीं है। सी # विशेष रूप से डिज़ाइन किया गया है ताकि आप सीपीयू और मेमोरी के बारे में नहीं सोच रहे हैं और इसके बजाय आप जिस व्यवसाय डोमेन के लिए लिख रहे हैं उसके बारे में सोच रहे हैं ।
इसका एक उदाहरण जो मैंने देखा है वह यह है कि बहुत सारे C ++ डेवलपर्स लूप्स के लिए उपयोग करना पसंद करेंगे, क्योंकि वे फॉर्च्यूनर से तेज़ हैं। यह आमतौर पर C # में एक बुरा विचार है क्योंकि यह संग्रह के संभावित प्रकारों को (और इसलिए पुन: प्रयोज्य और कोड के लचीलेपन) को सीमित करता है।
मुझे लगता है कि C ++ से C # तक पढ़ने का सबसे अच्छा तरीका एक अलग दृष्टिकोण से कोडिंग की कोशिश करना और दृष्टिकोण करना है। सबसे पहले यह कठिन होगा, क्योंकि आपके द्वारा लिखे गए कोड को फ़िल्टर करने के लिए आपके दिमाग में "सीपीयू और मेमोरी क्या कर रहे हैं" धागे का उपयोग करने के लिए पूरी तरह से उपयोग किया जाएगा। लेकिन C # में, आपको इसके बजाय व्यावसायिक डोमेन में ऑब्जेक्ट्स के बीच संबंधों के बारे में सोचना चाहिए। "मैं कंप्यूटर क्या कर रहा हूं" के विपरीत "मैं क्या करना चाहता हूं"।
यदि आप वस्तुओं की सूची में सब कुछ के लिए कुछ करना चाहते हैं, तो सूची पर लूप के लिए लिखने के बजाय, एक विधि बनाएं जो एक लेता है IEnumerable<MyObject>
और एक foreach
लूप का उपयोग करता है।
आपके विशिष्ट उदाहरण:
संसाधनों के जीवनकाल को नियंत्रित करने के लिए नियतात्मक सफाई (जैसे फ़ाइलों) की आवश्यकता होती है। यह हाथ में उपयोग करने में आसान है, लेकिन संसाधन के स्वामित्व को [… betwen धागे] स्थानांतरित होने पर इसे ठीक से कैसे उपयोग किया जाए? C ++ में मैं केवल साझा पॉइंटर्स का उपयोग करूँगा और इसे सही समय पर 'कचरा संग्रहण' का ध्यान रखूँगा।
आपको इसे C # (विशेषकर थ्रेड्स के बीच) में कभी नहीं करना चाहिए। यदि आपको किसी फ़ाइल में कुछ करने की आवश्यकता है, तो उसे एक समय में एक ही स्थान पर करें। यह एक रैपर वर्ग लिखने के लिए ठीक है (और वास्तव में अच्छा अभ्यास) जो अप्रबंधित संसाधन का प्रबंधन करता है जो आपकी कक्षाओं के बीच पास हो जाता है, लेकिन कोशिश न करें और थ्रेड्स के बीच एक फाइल पास करें और अलग-अलग कक्षाएं लिखें / पढ़ें / बंद करें / इसे खोलें। अप्रबंधित संसाधनों का स्वामित्व साझा न करें। Dispose
सफाई से निपटने के लिए पैटर्न का उपयोग करें ।
विशिष्ट जेनरिक के लिए ओवरराइडिंग कार्यों के साथ संघर्ष कर रहा है (मुझे C ++ में आंशिक टेम्पलेट विशेषज्ञता जैसी चीजें पसंद हैं)। क्या मुझे C # में किसी भी सामान्य प्रोग्रामिंग को करने के लिए किसी भी प्रयास को छोड़ देना चाहिए? शायद जेनरिक उद्देश्य पर सीमित हैं और समस्याओं के एक विशिष्ट डोमेन को छोड़कर उनका उपयोग करना # C -ish नहीं है?
सी # में जेनरिक को सामान्य बनाया गया है। जेनरिक की विशेषज्ञता व्युत्पन्न वर्गों द्वारा नियंत्रित की जानी चाहिए। List<T>
अगर यह एक List<int>
या एक अलग व्यवहार क्यों करना चाहिए List<string>
? किसी भीList<T>
पर लागू करने के लिए सभी ऑपरेशन सामान्य हैं । यदि आप ए पर विधि के व्यवहार को बदलना चाहते हैं , तो एक व्युत्पन्न वर्ग या एक निर्मित वर्ग बनाएं जो सामान्य रूप से सामान्य रूप से उपयोग करता है लेकिन चीजों को अलग तरीके से करता है। इससे आपको लिस्कोव सबस्टीट्यूशन सिद्धांत का उल्लंघन करने और दूसरों को अपनी कक्षा का उपयोग करने वाले लोगों पर शिकंजा कसने से बचने में मदद मिलती है। List<T>
.Add
List<string>
MySpecializedStringCollection : List<string>
MySpecializedStringCollection : IList<string>
मैक्रो जैसी कार्यक्षमता। जबकि आम तौर पर एक बुरा विचार है, समस्याओं के कुछ डोमेन के लिए कोई अन्य वर्कअराउंड नहीं है (जैसे किसी स्टेटमेंट का सशर्त मूल्यांकन, जैसे लॉग जो केवल डिबग रिलीज पर जाना चाहिए)। उनके नहीं होने का मतलब है कि मुझे और अधिक डालने की जरूरत है अगर (स्थिति) {...} बॉयलरप्लेट और यह अभी भी ट्रिगर करने के दुष्प्रभावों के बराबर नहीं है।
जैसा कि दूसरों ने कहा है, आप ऐसा करने के लिए प्रीप्रोसेसर कमांड का उपयोग कर सकते हैं। विशेषताएँ और भी बेहतर हैं। सामान्य विशेषताओं में उन चीजों को संभालने का सबसे अच्छा तरीका है जो एक वर्ग के लिए "कोर" कार्यक्षमता नहीं हैं।
संक्षेप में, C # लिखते समय, ध्यान रखें कि आपको पूरी तरह से व्यावसायिक डोमेन के बारे में सोचना चाहिए न कि सीपीयू और मेमोरी के बारे में। यदि आवश्यक हो तो आप बाद में अनुकूलन कर सकते हैं , लेकिन आपके कोड को उन व्यावसायिक सिद्धांतों के बीच संबंधों को प्रतिबिंबित करना चाहिए जिन्हें आप मैप करने की कोशिश कर रहे हैं।
C#
अन्य कोड उत्पन्न करने के लिए उपयोग करें। आप एकCSV
याXML
एक इनपुट के रूप में आपके पास क्या है या एक फाइल को पढ़ सकते हैं या एक फाइल उत्पन्नC#
कर सकतेSQL
हैं। यह कार्यात्मक मैक्रोज़ का उपयोग करने से अधिक शक्तिशाली हो सकता है।