2009-03-13 14 views
7

मैं सिर्फ तारों से निपट रहा था, और मुझे खुद को नाराज लगता है कि स्ट्रिंग्स शून्य हो सकती हैं। तो, मुझेसी # में कौन सी भाषा निर्णय आपको परेशान करता है?

if((teststring??string.Empty)==string.Empty) 

सभी जगहों पर होना चाहिए। स्ट्रिंग होगा? अपेक्षाकृत कुछ मामलों में शून्यता की अनुमति देने के लिए बहुत कठिन रहा है जहां इसकी आवश्यकता है (डीबीएस, बेवकूफ उपयोगकर्ता इनपुट इत्यादि)। मैं उन मामलों में केवल पढ़ने के इंटरफेस को निर्यात करने के साथ खुद को परेशान करता हूं जहां मुझे कुछ प्रकार की स्थिरता चाहिए। तो, सी # भाषा निर्माण/निर्णय आपको क्या परेशान करता है?

संपादित करें: isnullorempty फ़ंक्शन के लिए धन्यवाद, मैंने इसे पहले नहीं देखा था! अशक्त के लिए

+10

या यदि आप कर सकते हैं (string.IsNullOrEmpty (teststring)) ... –

+0

ऐसा buzzkill jjnguy न हो। शुक्रवार और इसके प्रोग्रामिंग से संबंधित यह एक मजेदार सवाल है। इसके अलावा यह नहीं लग रहा है, मैं उत्सुक हूँ कि लोगों को परेशान करता है। सिर्फ इसलिए कि एक isnullorempty है कि मेरे लिए कम परेशान तारों को कम परेशान करने का फैसला नहीं करता है। – Steve

+0

यह भी देखें: http://stackoverflow.com/questions/411906/c-net-design-flaws/ –

उत्तर

21

स्ट्रिंग बनाना एक संदर्भ प्रकार मेरे लिए पूरी तरह से उचित लगता है।

यह एक शर्म की बात है कि कोई एक चर/पैरामीटर/रिटर्न प्रकार गैर-शून्य होने की घोषणा नहीं कर सकता - उदाहरण के लिए

// Never returns null 
public string! Foo() 
{ 
} 

.NET 4.0 में कोड अनुबंध इस के साथ मदद करेंगे, मुझे विश्वास है - लेकिन इसे व्यापक बनाने में थोड़ा देर हो चुकी है।

कुछ समय पहले मैंने blog entry on the mistakes of C# लिखा था।

सी # 1:

  • अलग गेटर/संपत्तियों के लिए सेटर पहुंच की कमी के कारण उस पोस्ट संक्षेप में प्रस्तुत करना।
  • जेनरिक की कमी। शुरुआत से जेनरिक के साथ जीवन बहुत मीठा होता।
  • कक्षाओं को डिफ़ॉल्ट रूप से बंद नहीं किया जा रहा है।
  • Enums बस नामों का नाम दिया जा रहा है।
  • "\ x" चरित्र भागने अनुक्रम।
  • स्विच बयान के बारे में विभिन्न चीजों :)
  • कुछ अजीब अधिभार संकल्प नियमों
  • "ताला" कीवर्ड, बजाय एक ताला tocken के साथ "का उपयोग कर" की।

सी # 2:

  • आंशिक तरीकों की कमी
  • सामान्य विचरण (सी # में आ रहा है 4)
  • System.Nullable वर्ग (नहीं Nullable<T> की कमी (सी # 3 में आया था) - यह ठीक है!)
  • आंतरिक दृश्यमान सार्वजनिक कुंजी टोकन की बजाय दृढ़ता से हस्ताक्षरित असेंबली के लिए पूरी सार्वजनिक कुंजी की आवश्यकता है।

सी # 3:

  • अचल स्थिति के लिए समर्थन की कमी - परिवर्तन के बहुत सारे प्रकार (स्वत: गुण, वस्तु और संग्रह initializers) परिवर्तनशील के लिए सुधार के अवसरों लेकिन इनमें से कोई भी वास्तव में परिवर्तनशील प्रकार
  • के लिए काम
  • एक्सटेंशन विधि खोज
+0

अच्छी सूची। मुझे ऐतिहासिक दृष्टिकोण पसंद है! – Steve

+0

सूची में अधिकतर काफी हद तक "अगले संस्करण में आने वाली चीजों की कमी है"; फिर भी हम हमेशा तब तक जीवित रहे जब तक उन्हें जोड़ा नहीं गया ... उनमें से कुछ असली गलतियां हैं, हालांकि - मैं अनुदान दूंगा। –

+0

"अगले संस्करण में सामान" के बारे में - इनमें से कुछ सिर्फ मूर्ख थे। एक निजी सेटर की इजाजत नहीं है? Ick। यह एक स्पष्ट भलाई होना चाहिए था। आवश्यकता को तलाशने के लिए आंशिक तरीकों को थोड़ा कठिन होता। जेनिक्स स्पष्ट रूप से आवश्यक था, लेकिन परिभाषित करना मुश्किल था (यानी अधिक समय की आवश्यकता है)। –

28

परीक्षण तार डी या खाली सबसे अच्छा उपयोग किया जाता है:: फिर भी यह व्यर्थ जा रहा है पर मेरी झुंझलाहट को कम नहीं करता है

if (string.IsNullOrEmpty(testString)) 
{ 
} 
+0

चूंकि इस प्रश्न को अभी भी ट्रैफ़िक का थोड़ा सा हिस्सा मिल गया है, इसलिए यह ध्यान देने योग्य है कि अब हमारे पास 'स्ट्रिंग। आईएस नूलऑरहाइट स्पेस' भी है। – Yuck

0

तरह से मैं 3.0 भी ग # में एक अंतरफलक से गुण को लागू करना हालांकि वे इंटरफ़ेस के समान ही हैं जब मैं ऑटो गुणों का डिफ़ॉल्ट व्यवहार नहीं बदल रहा हूं।

उदा।

public interface MyInterface 
{ 
    int MyProperty { get; set;} 
} 

public class MyClass : MyInterface 
{ 
    public int MyProperty { get; set; } 
} 

public class MyClass2 : MyInterface 
{ 
    public int MyProperty { get; set; } 
} 

public class MyClass3 : MyInterface 
{ 
    public int MyProperty { get; set; } 
} 

संपादित करें: इस पर कुछ टिप्पणियों को संबोधित करने के लिए। मैं अपने गेटर के किसी भी डिफ़ॉल्ट व्यवहार को नहीं बदल रहा हूं। मैं कक्षा और इंटरफ़ेस के बीच अंतर को समझता हूं, मेरा मुद्दा यह है कि मैं इसे इंटरफ़ेस के साथ चिह्नित करता हूं, मुझे इस प्रॉपर्टी को प्रत्येक कार्यान्वयन वर्ग के अंदर नहीं रखना चाहिए जब तक कि मैं गेटटर या सेटर के डिफ़ॉल्ट व्यवहार को बदलना नहीं चाहता। कल्पना करें कि 500 ​​इंटरफ़ेस इस इंटरफ़ेस को कार्यान्वित करते हैं?

इसके अलावा mixins की कमी ..

+1

यह कैसे समझ में नहीं आता है? भले ही यह वही पाठ है, लेकिन अर्थ बहुत अलग है। इंटरफेस सिर्फ यह कह रहा है "संपत्ति एक गेटटर होगा"। कक्षा "कंपाइलर कह रही है, कृपया एक निजी क्षेत्र बनाएं और इसे गेटटर के अंदर अनमोडिफाइड करें"। –

+1

यह निर्णय मुझे समझ में आता है। इसके बिना, अगर आप को केवल एक संपत्ति की आवश्यकता होती है, या केवल एक संपत्ति सेट की आवश्यकता होती है तो आप कैसे अंतर करेंगे? क्या होगा यदि आपकी कक्षा ने स्वचालित गुणों का उपयोग नहीं किया (या v2 में तर्क के साथ बढ़ाया गया था)? –

+0

हां लेकिन मैं जो कह रहा हूं वह यह है कि एक बार जब मैंने इंटरफ़ेस को कार्यान्वित किया है तो संपत्ति को दृश्यों के पीछे लागू किया जाना चाहिए जब तक कि मैं इसे बदलना नहीं चाहता। मुझे लगता है, विशेष रूप से डेटा ट्रांसफर ऑब्जेक्ट्स के साथ कि मैं एक ही कोड लिख रहा हूं। –

5
बाहर

और रेफरी पैरामीटर

+1

आप इसे अन्यथा कैसे संभालेंगे? –

+4

एक समग्र वस्तु लौटें। –

+0

+1 हां, यह, 100%। मैं ** ** से नफरत करता हूं कि 'TryParse' आउटपुट पैरामीटर का उपयोग करता है। 'Int32.TryParse'' के लिए 'ParseResult ' ऑब्जेक्ट को 'अपवाद' और 'मान' गुणों के साथ वापस करने के लिए सुंदर होगा। स्पष्टीकरण के लिए – Yuck

1

मिच के जवाब पर विस्तार।

वास्तव में यह एक सीएलआर निर्णय है, सी # एक नहीं। सी # का बीसीएल सिस्टम के कार्यान्वयन विवरण पर कोई नियंत्रण नहीं है। स्टिंग क्लास।

ट्रू सी # में कंपाइलर में विशेष श्रेणीबद्ध स्ट्रिंग हो सकती है और कहा कि हम विशेष शून्य जांच करेंगे लेकिन इसमें आईएमएचओ खराब निर्णय होगा। String.IsNullOrEmpty एक स्वीकार्य समझौता है।

+0

धन्यवाद। – Steve

6

शायद सी # में सबसे बड़ी स्पष्ट छेद, मेरे लिए enums है।

जावा एनम्स टाइपएफ़ कक्षाएं हैं जिन्हें आप व्यवहार दे सकते हैं, इंटरफेस को कार्यान्वित कर सकते हैं और इसी तरह।

सी # /। नेट एनम्स केवल सभी समस्याओं के साथ इंक की महिमा कर रहे हैं, जो स्थिरांक स्थिरांक सी और सी ++ पर वापस जा रहे हैं।

+1

दूसरी तरफ, आप आसानी से जटिल जावा enums को कक्षा के रूप में लिखकर अनुकरण कर सकते हैं: पी एकमात्र चीज जिसे आप याद करेंगे, वह 'स्विच' करने की क्षमता है उन पर। – JulianR

+0

इसके अलावा कोई और अधिक नहीं है, जैसे कि धारावाहिक/deserialization के माध्यम से एक मानक मूल्य के कितने उदाहरण हैं। – cletus

1

एक गैर-खाली मामले में तोड़ने का प्रवर्तन।

विशेष रूप से मामले के मामले में, enums की Verbosity। अगर मेरे पास स्विच (एक्सप्रप्र) है और एक्सप्रो एक enum है, तो मुझे प्रत्येक मामले में प्रत्येक enum को पूरी तरह से अर्हता प्राप्त करने के लिए मजबूर नहीं किया जाना चाहिए, जब तक कोई नामकरण संघर्ष न हो।

0

जब आधार वर्ग अधिभावी या इंटरफ़ेस तरीकों को लागू करने के लिए अनुमति देता नहीं सह/विपरीत विचरण या अधिकारों का उपयोग परिवर्तन:

public class A 
{ 
    protected virtual Stream method() 
    { 
     //...stuff... 
    } 
} 

public class B : A 
{ 
    // compiler borks... 
    public override FileStream method() 
    { 
     //...more stuff... 
    } 
} 
1

जांचे हुए अपवादों महान हो गया होता। मुझे पता है कि बहुत से लोग जावा से उन्हें नफरत करते हैं, लेकिन मुझे लगता है कि यह हमेशा लागू किया गया स्वच्छता जांच है, खासकर आई/ओ पर। मुझे उन चीजों में से अधिकांश पसंद है जो सी # परिवर्तित और/या जावा की तुलना में जोड़े गए हैं, लेकिन मुझे वास्तव में उन्हें चेक अपवादों को अपनाया जाना पसंद होता। अब बहुत देर हो चुकी है (.NET ढांचे को बदल दिया जा रहा है ताकि वे वहां लगभग हर कार्यक्रम को तोड़ दें) लेकिन मुझे लगता है कि उन्हें रखना बेहतर होगा।

0

मुझे जगह पर IEnumerable<MyType> टाइप करने से नफरत है। पढ़ना बहुत मुश्किल है। मैं अपने कोड क्लीनर बनाने के लिए इसके लिए कुछ प्रकार का छोटा हाथ पसंद करूंगा।

यह SO post इसे अच्छी तरह से प्रस्तुत करता है।

0

मुझे यह बेहद परेशान लगता है कि बहुत से कोर विधियां स्थैतिक हैं, खासकर आमतौर पर स्ट्रिंग्स और एरेज़ जैसी सामान्य रूप से प्रयुक्त सामग्री के आसपास।

क्यों:

Array.Sort(myArray); 
String.IsNullOrEmpty(myString); 

के बजाय:

myArray.Sort(); 
myString.IsNullOrEmpty 

कह नहीं वहाँ नहीं इसके लिए अच्छे कारणों के होते हैं और यह एक बड़ी बात नहीं है, लेकिन अगर जे एस यह प्रबंधन कर सकते हैं, क्यों कर सकते हैं ' टी सी #? *

इसके अलावा स्विच कार्यान्वयन। मुझे सच में लगता है कि उन्हें हमें गिरावट के साथ भरोसा करना चाहिए था।

* उस पर आओ मैं जेएस के बंद वाक्यविन्यास को भी याद करता हूं।

0

मुझे आईडीस्पोजेबल/डिस्प्ले इत्यादि पसंद नहीं है। सी ++ से आने से सी # में मेमोरी मैनेजमेंट के बारे में सोचना बहुत परेशान है। उपयोग कथन ठीक है अगर डिस्पोजेबल ऑब्जेक्ट केवल एक फ़ंक्शन में उपयोग किया जाता है। यदि इसे चारों ओर पारित किया जाना है तो आपको गिनती का मैन्युअल रूप से संदर्भित करने की आवश्यकता है या यह जानने के लिए कुछ और करना है कि आप ऑब्जेक्ट का निपटान कब कर सकते हैं।

0

मैं कक्षा वस्तुओं को भाषा में प्रथम श्रेणी की वस्तुओं के रूप में देखना चाहता हूं।

इससे आपको स्थिर तरीकों को ओवरराइड करने और इंटरफ़ेस में घोषित करने की अनुमति मिल जाएगी।

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