C # या। नेट सुविधाओं के लिए कोई पिछड़ी हुई अनुकूलता की जरूरत नहीं है? [बन्द है]


18

कोई भी उत्पाद या ढांचा विकसित होता है। मुख्य रूप से यह उपयोगकर्ताओं की जरूरतों को पकड़ने के लिए किया जाता है, नई कंप्यूटिंग शक्तियों का लाभ उठाता है और बस इसे बेहतर बनाता है। कभी-कभी प्राथमिक डिजाइन लक्ष्य भी उत्पाद के साथ बदल जाता है। C # या .net फ्रेमवर्क कोई अपवाद नहीं है। जैसा कि हम देखते हैं, वर्तमान 4 वें संस्करण पहले वाले की तुलना में बहुत अलग है। लेकिन इस विकास के लिए एक बाधा के रूप में बात आती है- पिछड़ी अनुकूलता।

अधिकांश चौखटे / उत्पादों में ऐसी विशेषताएं हैं जो पिछड़ी अनुकूलता का समर्थन करने की आवश्यकता न होने पर काट दी जाती थीं। आपके अनुसार, C # / नेट में ये विशेषताएं क्या हैं?

कृपया प्रति उत्तर एक विशेषता का उल्लेख करें।



4
दिशा-निर्देशों के अनुसार प्रश्न स्पष्ट रूप से रचनात्मक नहीं है, और शानदार उत्तरों के आधार पर स्पष्ट रूप से रचनात्मक है। दोबारा खोलने के लिए मतदान।
Psr

1
यह शर्म की बात है, अभी भी शायद एरिक यहाँ जवाब देने के बजाय यह ब्लॉग करेगा?
जे.के.

जवाबों:


35

अनाम तरीके । मुझे लगता है कि हर कोई इस बात से सहमत है कि C # 2.0 के लिए चुनी गई अनाम विधि सिंटैक्स चंकी और क्लंकी है, लैंबडा सिंटैक्स की तुलना में हमने C # 3.0 जोड़ा। समान कार्य करने के लिए लगभग दो-समान वाक्यविन्यासों का होना दुर्भाग्यपूर्ण है।


1
सहमत, अनाम तरीके बहुत अच्छे थे जब हमारे पास लैम्ब्डा नहीं थे ... अब वे केवल अनावश्यक हैं।
माइकल ब्राउन

9
अनाम विधियों की एक विशेष विशेषता है, जो लंबोदर भावों से कहीं बेहतर है .... उनका सही नाम !!
उत्तोलन

1
इस बिंदु पर, मुझे C # में एक अनाम विधि के लिए वाक्यविन्यास भी याद नहीं है। मैं इसे देखने के लिए अगर कुछ विचित्र कारण के लिए मैं एक मेमने के बजाय एक का उपयोग करने की आवश्यकता होगी।
क्यूरेला

33

मुझे गैर-सामान्य संग्रह से छुटकारा मिल जाएगा। वे एक घृणित बात हैं ... और ऐसे बहुत से मामले हैं जहाँ मैं linq का उपयोग कर रहा हूँ और कुछ ऐसा करना है

var customObjects = container.CustomObjects.Cast<CustomObject>();

जब भी मुझे ऐसा करना पड़ता है, मेरी आत्मा का एक छोटा हिस्सा मर जाता है।


यह बहुत शानदार है।

1
.NET के सभी पोर्ट जेनरिक सपोर्ट नहीं करते हैं। .NET माइक्रो एक उदाहरण है। यदि CustomObjects इस प्लेटफ़ॉर्म पर कभी नहीं जाएंगे, तो लागू न हों।
goodguys_activate

2
आत्मा नहीं होने का यही फायदा है।
कैफीक ने

29

एक प्रकार के रूप में शून्य । पृथ्वी पर "शून्य" एक प्रकार क्यों है? इसका कोई उदाहरण नहीं है, इसका कोई मूल्य नहीं है, आप इसे सामान्य प्रकार के तर्क, औपचारिक पैरामीटर प्रकार, स्थानीय प्रकार, फ़ील्ड प्रकार या संपत्ति प्रकार के रूप में उपयोग नहीं कर सकते। इसका कोई प्रकार के रूप में कोई अर्थ नहीं है; बल्कि, यह एक तथ्य है कि वर्चुअल मशीन के ढेर पर एक विधि कॉल का क्या प्रभाव पड़ता है। लेकिन वर्चुअल मशीन सिर्फ इतना है: एक वर्चुअल मशीन। असली मशीन एक रजिस्टर में लौटाए गए मान (आमतौर पर x86 पर EAX) को रखेगी और स्टैक को बिल्कुल भी प्रभावित नहीं करेगी! एक प्रकार के रूप में शून्य केवल एक बुरा विचार है।

इससे भी बदतर: जब एक पॉइंटर प्रकार में उपयोग किया जाता है, void*तो इसका मतलब है कि रिटर्न प्रकार के रूप में उपयोग किए जाने से इसका मतलब पूरी तरह से अलग है। अब इसका अर्थ है "अज्ञात प्रकार के भंडारण स्थान के लिए एक संकेतक", जिसका इसके अर्थ के साथ कुछ भी करने के लिए कुछ भी नहीं है "एक विधि जो किसी भी मूल्य को वापस नहीं करती है।"

हम void*एक पॉइंटर प्रकार के साथ बदल सकते हैं IntPtr। (और के void**साथ IntPtr*और इतने पर।) हम शून्य को "यूनिट" के साथ एक वापसी प्रकार के रूप में बदल सकते हैं, एक प्रकार जिसका एक एकल मूल्य है, अर्थात् शून्य। सीएलआर का कार्यान्वयन तब यह तय कर सकता है कि एक इकाई-टाइप फ़ंक्शन कॉल रजिस्टर या स्टैक के अपने उपयोग को उचित रूप से अनुकूलित कर सकता है, यह जानते हुए कि "वापस लौटाए जा रहे" नल को सुरक्षित रूप से अनदेखा किया जा सकता है।

ऐसी दुनिया में आपको अलग Func<A, R>और Action<T>प्रतिनिधियों की आवश्यकता नहीं है । Action<T>बस है Func<T, Unit>


4
... और Taskबस एक है Task<Unit>। Async CTP के लाइब्रेरी बिट्स को फिर से लागू करने से मुझे वास्तव में इसके लिए इच्छा हुई ...
जॉन स्कीट

24

खाली बयान; । त्रुटि-प्रवण, लगभग हमेशा एक टाइपो, और आपको कोई अतिरिक्त अर्थ नहीं देता है जो पहले से व्यक्त नहीं है {}


7
64-बिट JIT </ snark> के तहत विशाल प्रदर्शन दंड का उल्लेख नहीं करना।
जेसी सी। स्लीकर

7
खाली स्टेटमेंट में परफॉर्मेंस पेनल्टी है? ऐसा क्यों है?
क्वेंटिन-स्टारिन

22

संदर्भ प्रकार के सरणियों पर असुरक्षित सहसंयोजक । प्रकार के सहसंयोजक के साथ IEnumerable<T>, कम से कम सरणी सहसंयोजक की आवश्यकता के कुछ दूर चला गया है। (यदि हमारे पास एक सहसंयोजक केवल-पढ़ने के लिए इंटरफ़ेस है, तो हमें इसकी आवश्यकता नहीं होगी।)


मैं इसे पूरी तरह से लिखने जा रहा था, जब मैंने प्रश्न शीर्षक देखा - आपने मुझे इसे हराया :(
क्रिस स्मिथ

1
एक सहसंयोजक सरणी संदर्भ प्राप्त करने और उस सरणी संदर्भ को सुरक्षित रूप से लिखने की क्षमता जो इससे पढ़ी गई थी , उपयोगी है। यदि IList<T>विरासत IReadableList<out T>और गैर-जेनेरिक की तरह IPemutable, यह छँटाई जैसी चीजों का समर्थन कर सकता है, लेकिन सरणियाँ इसे अधिक आसानी से समर्थन करती हैं।
सुपरकैट

14

एकतरफा प्लस ऑपरेटर । सभी समय के कम से कम उपयोगी ऑपरेटर। अगर हमें इसे पीछे के कॉम्पिटिटर के लिए नहीं रखना था, तो मैं इसे दिल की धड़कन में ले जाऊंगा। इस चीज का उपयोग कौन करता है, कोई भी?

( +xक्लेरिफिकेशन: यूनीरी प्लस ऑपरेटर प्रीइंक्रिमेंट ऑपरेटर ++xनहीं है, न ही पोस्टइनक्रीमेंट ऑपरेटर x++और न ही बाइनरी ऑपरेटर x+y।)


1
के लिए (int i = 0; मैं <छत; मैं ++)
माइकल ब्राउन

13
वह प्रीइंक्रिमेंट और पोस्टइंक्रिमेंट ऑपरेटर्स के बारे में बात नहीं कर रहा है: वह एक नंबर पर नकारात्मक संकेत के विपरीत, यूनरी प्लस के बारे में बात कर रहा है +1 == 1:। यह एक बहुत से अधिक के करीब रफ़ू है।
जेसी सी। स्लीकर

8
यह मशीन पठनीय आउटपुट पर प्रभाव के बारे में नहीं है, यह मनुष्यों के लिए कोड के रूप में सुधार कर सकता है if(a == +1 || a == -1){...}:।
थॉमस ब्राट

5
@ शुग्गीकोउक: इसके बारे में विशेष रूप से विचित्र है कि यह अधिभार है । क्योंकि ऐसा बहुत होता है। आप जानते हैं, आप कुछ जावास्क्रिप्ट कैसे लिख रहे हैं और आपको लगता है कि आदमी, मैं चाहता हूं कि जेएस ने मुझे उपयोगकर्ता-परिभाषित यूनीरी प्लस ऑपरेटर शब्दार्थ बनाने की अनुमति दी जैसे सी # करता है
एरिक लिपर्ट

2
@ मुझे इस बात का अंदाजा नहीं था कि यह ओवरलोडेबल है। वाह आप इसके साथ कुछ बुरा काम कर सकते हैं :)
ShuggyCoUk

12

डिफ़ॉल्ट शाब्दिक को double

अधिकांश व्यावसायिक ऐप्स के लिए, decimalवैसे भी अधिक उपयुक्त है ... या शायद यह केवल एक डिफ़ॉल्ट के विचार को हटाने के लिए बेहतर होगा , और डेवलपर को वास्तव में विकल्प बनाने के लिए मजबूर करना होगा।

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


मैं शायद उन
शाब्दिकों की

यदि वे जावा में हैं - जोशुआ ब्लोच द्वारा डिज़ाइन किए गए पवित्र ग्रंथों को देखें "विरासत के लिए डिज़ाइन या दस्तावेज़ या फिर इसे" martinfowler.com/bliki/DesignedInheritance.html IIRC कोटलिन डिफ़ॉल्ट रूप से वर्ग सील करता है, इसलिए उद्योग में स्थानांतरित हो रहा है इस संबंध में एक बेहतर दिशा।
एलजार लीबॉविच

कक्षाओं को क्यों सील किया जाना चाहिए?
जेम्स

@ नाम: बिल्कुल कारणों से जोश देता है। एक वर्ग को डिजाइन करना जो एक समझदार, सुसंगत तरीके से वंशानुक्रम को सक्षम बनाता है - समय लगता है और ऐसा करने के बिना यह जानने के बिना कि विरासत का उपयोग कैसे किया जा रहा है और भी बदतर है।
जॉन स्कीट

1
@ स्पेसर: अपरिवर्तनीयता के बारे में सोचें, उदाहरण के लिए। एक गैर-सील वर्ग अपरिवर्तनीय होने का दावा नहीं कर सकता है, क्योंकि उपवर्ग उत्परिवर्तन का परिचय दे सकते हैं।
जॉन स्कीट

7

यह एक सुविधा की तुलना में अधिक दिशानिर्देश है, लेकिन मुझे लगता है कि यह महत्वपूर्ण है क्योंकि यह पहले से ही लोगों के दिमाग में विहित और सबसे अच्छा समाधान के रूप में निपुण है:

आधिकारिक पैटर्न लागू करने के लिएIDisposable

यह बोझिल है और बेहतर तरीके हैं


6

मुझे पता है कि विभिन्न टाइमर कक्षाओं के बीच बड़े अंतर हैं। लेकिन क्या हम उनमें से एक या दो से छुटकारा नहीं पा सकते हैं, वैसे भी?


4

तरीके और के प्रकार Arrayऔर List<T>कि, Linq के साथ अप्रचलित हो गई उदाहरण के लिए:

  • Array.TrueForAll से बदला जा सकता है Enumerable.All
  • Array.FindAll से बदला जा सकता है Enumerable.Where
  • List<T>.ConvertAll से बदला जा सकता है Enumerable.Select
  • Predicate<T> से बदला जा सकता है Func<T, bool>
  • Converter<T,R> से बदला जा सकता है Func<T, R>
  • IComparer<T> वास्तव में एक प्रतिनिधि होना चाहिए Func<T, T, int>

3
मुझे पसंद है Predicate<T>क्योंकि यह इस बात पर इरादा रखता है कि फ़ंक्शन का उपयोग कैसे किया जाता है और छोटे टाइपिंग को बचाता है।
ज़ेबी

2

गैर-जेनेरिक प्रतिनिधि गैर-सामान्य संग्रह की तरह, गैर-सामान्य प्रतिनिधि अब बेकार हैं कि हमारे पास फंक और एक्शन श्रृंखला है। और मैंने तीन मापदंडों पर वेरिएंट को काट दिया होगा। यदि आपके पास तीन से अधिक पैरामीटर हैं, तो एक संरचना बनाएं और इसे एकल पैरामीटर के रूप में उपयोग करें। ईवेंट हैंडलिंग के लिए एक विशिष्ट प्रतिनिधि की घोषणा बहुत डीआरवाई नहीं है।


3
आप एक प्रतिनिधि को एक विधि से कैसे परिभाषित करेंगे जो एक्शन या फ़ंक के साथ एक रेफ इंट लेती है? आप फंक के साथ एक कॉम्बिनेटर को कैसे परिभाषित करेंगे ? अर्थात्, "प्रतिनिधि डीडी (डी डी);" कहने का कोई तरीका नहीं है। फंक के साथ।
एरिक लिपर्ट

2
हममम ... मैं सही खड़ा हूँ। इसलिए मैं उन उपकरणों को बनाने का काम छोड़ देता हूं जिनका उपयोग मैं आपके सक्षम हाथों में करता हूं;)
माइकल ब्राउन

@EricLippert: मैं एक विशेष प्रतिनिधि वर्ग देखना चाहूंगा, जो CLR जादू के माध्यम से "हर" arity और वैल्यू / रेफरेंस पैरामीटर्स के प्रतिनिधियों को शामिल करेगा [एक उपयुक्त रूप से स्वरूपित नाम के साथ मैजिक क्लास में एक प्रतिनिधि की खोज करना। प्रकार], और उस से विरासत में मिले उचित हस्ताक्षर के सभी प्रतिनिधि हैं। कोड जो एक विशेष प्रतिनिधि चाहता है, उसे अभी भी एक सटीक प्रकार की आवश्यकता होगी, लेकिन कोड जो एक विशेष हस्ताक्षर चाहता है जादू नाम का उपयोग कर सकता है।
सुपरकैट

-1

asmx वेब सेवाएँ

मुझे लगता है कि वे आजकल WCF के साथ काफी अप्रचलित हैं।


6
हाँ, लेकिन कभी-कभी बहुत आसान है। । ।
व्याट बार्नेट

-2

Winforms
दो डेस्कटॉप प्लेटफार्मों के बीच नेविगेट नहीं करना अच्छा होगा। WPF वह जगह है जहां चीजें जा रही हैं, इसलिए इसकी निराशा प्लेटफॉर्म स्तर पर अतिरेक पर है।


Winforms WPF की तुलना में बहुत अधिक स्थिर, तेज और कम छोटी गाड़ी
लगती है

जब आपको बस एक छोटे से डेस्कटॉप ऐप को हैक करने की आवश्यकता होती है, तो WPF प्रमुख ओवरकिल होता है।
Kyralessa

ऐसा लगता है कि बीच में WPF WinRT के पक्ष में काफी अप्रचलित हो गया है। हालांकि, मुझे लगता है कि यह Winforms व्यवसाय के विकास में WPF से अधिक जीवित है। यह भी देखें stackoverflow.com/questions/913417/…
Doc Brown
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.