मुझे खुशी है कि सी # आपको स्थिर सदस्यों तक पहुंचने नहीं देता है, जैसे कि वे उदाहरण के सदस्य थे। यह जावा में एक आम बग से बचा जाता है:वंचित प्रकारों के माध्यम से स्थिर सदस्यों तक पहुंचने के लिए क्यों उपयोगी है?
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
की पेशकश कर रहा था)।
मेरी (अदूरदर्शा) राय में, इस सुविधा:
- शब्दाडंबर को कम नहीं करता है; प्रोग्रामर को एक प्रकार का नाम एक या दूसरा निर्दिष्ट करना होगा (ऑपरेटरों और मामलों को छोड़कर जब कोई वर्तमान प्रकार के विरासत वाले स्थिर सदस्यों तक पहुंच रहा हो)।
- ऊपर दिए गए बग/भ्रामक कोड को प्रोत्साहित करता है।
- प्रोग्रामर को सुझाव दे सकता है कि सी # में स्थिर तरीके कुछ प्रकार के 'बहुरूपता' प्रदर्शित करते हैं, जब वे नहीं करते हैं।
- (माइनर) 'चुप' पेश करता है, संभावित रूप से पुन: संकलन पर अनजान रिबाइंडिंग संभावनाएं।
(IMO, ऑपरेटरों एक विशेष मामला है कि उनके अपने चर्चा वारंट कर रहे हैं।)
यह देखते हुए कि सी # सामान्य रूप से भाषा एक "सफलता के गड्ढे" है, क्यों इस सुविधा मौजूद है? मैं इसके लाभ नहीं देख सकता ('खोज योग्यता' के अलावा, जिसे हमेशा आईडीई में हल किया जा सकता है), लेकिन मुझे कई समस्याएं दिखाई देती हैं।
या, बदतर, 'UTF8Encoding.ASCII'। – SLaks
मैं मानता हूं कि यह थोड़ा भ्रामक हो सकता है, लेकिन यह सिद्धांत के अनुरूप है कि * विरासत वाले सदस्यों को व्युत्पन्न प्रकार * के सदस्य के रूप में माना जाता है।ध्यान दें कि हम स्पष्ट रूप से * नहीं * इस पैटर्न को बाध्य प्रकार पैरामीटर पर अनुमति देते हैं क्योंकि तब यह वास्तव में काफी भ्रामक है। विवरण के लिए http://blogs.msdn.com/b/ericlippert/archive/2007/06/14/calling-static-methods-on-type-parameters-is-illegal-part-one.aspx देखें। –