2011-02-09 13 views
18

मुझे खुशी है कि सी # आपको स्थिर सदस्यों तक पहुंचने नहीं देता है, जैसे कि वे उदाहरण के सदस्य थे। यह जावा में एक आम बग से बचा जाता है:वंचित प्रकारों के माध्यम से स्थिर सदस्यों तक पहुंचने के लिए क्यों उपयोगी है?

Thread t = new Thread(..); 
t.sleep(..); //Probably doesn't do what the programmer intended. 

दूसरी ओर, यह आप व्युत्पन्न प्रकार 'से लेकर' स्थिर सदस्यों तक पहुंचने देने के करता है। ऑपरेटरों के अलावा (जहां यह आपको लिखने से बचाता है), मैं किसी भी मामले के बारे में नहीं सोच सकता जहां यह वास्तव में सहायक है। वास्तव में, यह सक्रिय रूप से इस तरह के रूप गलतियों को प्रोत्साहित करती है:

// Nasty surprises ahead - won't throw; does something unintended: 
// Creates a HttpWebRequest instead. 
var ftpRequest = FtpWebRequest.Create(@"http://www.stackoverflow.com"); 

// Something seriously wrong here. 
var areRefEqual = Dictionary<string, int>.ReferenceEquals(dict1, dict2); 

मैं व्यक्तिगत रूप से अधिक से अधिक मिलती-जुलती त्रुटियां करने से जब मैं अपरिचित API (मैं अभिव्यक्ति के पेड़ के साथ बंद शुरू कर याद के माध्यम से अपने रास्ते तलाश कर रहा हूँ रखना, मैं संपादक में BinaryExpression. मारा और सोच रहा था कि क्यों पृथ्वी पर IntelliSense मुझे एक विकल्प के रूप में MakeUnary की पेशकश कर रहा था)।

मेरी (अदूरदर्शा) राय में, इस सुविधा:

  1. शब्दाडंबर को कम नहीं करता है; प्रोग्रामर को एक प्रकार का नाम एक या दूसरा निर्दिष्ट करना होगा (ऑपरेटरों और मामलों को छोड़कर जब कोई वर्तमान प्रकार के विरासत वाले स्थिर सदस्यों तक पहुंच रहा हो)।
  2. ऊपर दिए गए बग/भ्रामक कोड को प्रोत्साहित करता है।
  3. प्रोग्रामर को सुझाव दे सकता है कि सी # में स्थिर तरीके कुछ प्रकार के 'बहुरूपता' प्रदर्शित करते हैं, जब वे नहीं करते हैं।
  4. (माइनर) 'चुप' पेश करता है, संभावित रूप से पुन: संकलन पर अनजान रिबाइंडिंग संभावनाएं।

(IMO, ऑपरेटरों एक विशेष मामला है कि उनके अपने चर्चा वारंट कर रहे हैं।)

यह देखते हुए कि सी # सामान्य रूप से भाषा एक "सफलता के गड्ढे" है, क्यों इस सुविधा मौजूद है? मैं इसके लाभ नहीं देख सकता ('खोज योग्यता' के अलावा, जिसे हमेशा आईडीई में हल किया जा सकता है), लेकिन मुझे कई समस्याएं दिखाई देती हैं।

+3

या, बदतर, 'UTF8Encoding.ASCII'। – SLaks

+1

मैं मानता हूं कि यह थोड़ा भ्रामक हो सकता है, लेकिन यह सिद्धांत के अनुरूप है कि * विरासत वाले सदस्यों को व्युत्पन्न प्रकार * के सदस्य के रूप में माना जाता है।ध्यान दें कि हम स्पष्ट रूप से * नहीं * इस पैटर्न को बाध्य प्रकार पैरामीटर पर अनुमति देते हैं क्योंकि तब यह वास्तव में काफी भ्रामक है। विवरण के लिए http://blogs.msdn.com/b/ericlippert/archive/2007/06/14/calling-static-methods-on-type-parameters-is-illegal-part-one.aspx देखें। –

उत्तर

7

मैं मानता हूं कि यह एक गलतफहमी है। मैं नहीं जानता कि कितनी बार स्टैक ओवरफ़्लो पर किसी का कोड पोस्ट की है:

ASCIIEncoding.ASCII 

आदि ... जो है, जबकि निष्पादन के मामले में हानिरहित कोड को पढ़ने के मामले में भ्रामक है।

जाहिर है कि अब इस "फीचर" को हटाने में बहुत देर हो चुकी है, हालांकि मुझे लगता है कि सी # टीम इस और अन्य शैली के मुद्दों के लिए सुपर-वर्बोज़ चेतावनी मोड पेश कर सकती है।

शायद सी # के उत्तराधिकारी चीजों में सुधार होगा ...

+0

दरअसल, मैंने केवल यह देखा है कि [एक बार] (http://stackoverflow.com/questions/4252426/webclient-unicode-which-utf8) SO पर। – SLaks

+0

स्टाइलकॉप इन्हें पकड़ने का प्रयास कर सकता है। – SLaks

+3

की तरह @ एसएलएक्स ने कहा, 'यूटीएफ 8 एन्कोडिंग.एएससीआईआईआईआई भी खराब है – digEmAll

2

यह WinForms में उपयोगी है।

कोई नियंत्रण या रूप में, आप MousePosition, MouseButtons, या ModifierKeysstatic सदस्यों Control से विरासत में मिला उपयोग करने के लिए लिख सकते हैं।

यह अभी भी बहस योग्य है कि यह एक अच्छा निर्णय था या नहीं।

+1

आप अभी भी एक वर्ग लिखने के निहित संदर्भ के माध्यम से "विरासत" स्थिर सदस्यों तक पहुंच सकते हैं, लेकिन किसी प्रकार का नाम निर्दिष्ट करते समय उन्हें एक्सेस नहीं कर पाएंगे * सही के अलावा अन्य। –

+0

सच है। मुझे यकीन नहीं है कि मैं इसके लिए किसी भी प्रयोग के बारे में सोच सकता हूं। – SLaks

+0

मैं जॉन से सहमत हूं, ये दो चीजें कुछ हद तक ऑर्थोगोनल हैं। मूक रिबाइंडिंग मुद्दा अभी भी वहां है, हालांकि यह WinForms में फसल करने के लिए मामूली और असंभव है। – Ani

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

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