2009-03-02 3 views
24

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

क्या सी # में द्वारा प्रदान की गई कार्यक्षमता की नकल करने के लिए कोई कीवर्ड या समान निर्माण है वीबी में कीवर्ड के साथ? यदि नहीं, तो क्या तकनीकी कारण है कि सी # में यह नहीं है?

संपादित करें: मैंने अपने प्रश्न पूछने से पहले इस पर एक मौजूदा प्रविष्टि की खोज की, लेकिन एक रे को संदर्भित नहीं किया गया (here)। प्रश्न को परिशोधित करने के लिए, क्या कोई तकनीकी कारण है कि सी # में यह क्यों नहीं है? और गुलजार ने इसे दबाया - नहीं, तकनीकी कारण नहीं हैं कि सी # में कीवर्ड के साथ क्यों नहीं है। यह भाषा डिजाइनरों द्वारा एक डिजाइन निर्णय था।

+0

(विषय से दूर, तुम Protobuf शुद्ध के बारे में पूछा - ड्रॉप मुझे [email protected] पर एक ई-मेल) –

+0

गुलजार नाज़ीम ने जो कहा, उसके अलावा, मैं एक सम्मेलन में था जहां एंडर हेलबर्ग के इस सवाल से पूछा गया था। उसका जवाब और अधिक था ... संक्षिप्त। 'सी # कभी भी कीवर्ड के साथ समर्थन प्रदान नहीं करेगा' –

उत्तर

22

यह वही सी # कार्यक्रम प्रबंधक में क्या कहना है है: Why doesn't C# have a 'with' statement?

  • छोटे या न के बराबर पठनीयता लाभ। हमने सोचा कि पठनीयता लाभ छोटे या अस्तित्वहीन थे। मैं कहूंगा कि कथन के साथ कोड कम पठनीय बनाता है, लेकिन कुछ लोग शायद करेंगे।

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

  • सी ++ विरासत। सी ++ के साथ कभी कथन नहीं था, और इस तरह के बयान की कमी को आम तौर पर सी ++ डेवलपर्स द्वारा समस्या नहीं माना जाता है। साथ ही, हमें यह नहीं लगता कि अन्य परिवर्तन - कोड के प्रकार में परिवर्तन, मंच में परिवर्तन, भाषा में अन्य परिवर्तन इत्यादि - बयानों के साथ और अधिक जरूरी है।

+1

@ गुलजार - लिंक के लिए धन्यवाद। यह खुजली खरोंच ', हालांकि मैं श्री विल्टमुथ की तर्क के पहले दो पंक्तियों से असहमत हूं। कीवर्ड के साथ, मेरे पास कोड पढ़ने के लिए आसान बनाने के बारे में पठनीयता के साथ कम करना पड़ता है ... –

+2

... और मुझे यह विश्वास करना मुश्किल लगता है कि कीवर्ड के साथ LINQ के साथ जटिलता के करीब कहीं भी है, अज्ञात तरीकों, आदि, लेकिन मैं digress। लिंक के लिए फिर से धन्यवाद। –

+0

मैट की मदद करने में खुशी हुई। –

0

नहीं, यह सी # देव टीम द्वारा किया गया एक सचेत निर्णय था। लोगों के साथ 'साथ' कीवर्ड के बारे में मिश्रित भावनाएं होती हैं क्योंकि अगर दुर्व्यवहार किया जाता है तो यह कोड पठनीयता को घटा सकता है (इसके साथ घोंसला)।

+0

मुझे पता नहीं था कि आप "कथन" के साथ घोंसला कर सकते हैं। इससे पठनीयता कम हो जाएगी। हालांकि, गोटो और कई अन्य प्रोग्रामिंग संरचनाओं की तरह, अगर अच्छी तरह से उपयोग किया जाता है, तो क्या यह वास्तव में इतना बुरा है? – Kibbee

+1

मुझे लगता है कि अगर यह ठीक से इस्तेमाल किया जा सकता है तो यह अच्छा हो सकता है। –

0

मुझे कल्पना नहीं है कि एक तकनीकी कारण यह अस्तित्व में नहीं है। हालांकि मैं क्या कहूंगा, यही कारण है कि यह अस्तित्व में नहीं है कि यह एक प्रोग्रामिंग निर्माण है जो पूरी तरह से टाइपिंग पर काटने के उद्देश्य से मौजूद है। इंटेलिजेंस जैसी चीजों के साथ, और कॉपी और पेस्ट करें, दुनिया को इस तरह की सुविधाओं के लिए वास्तव में बहुत अधिक मांग नहीं है। मैं वीबी.Net का उपयोग करता हूं, और याद नहीं कर सकता अगर यह अभी भी समर्थित है। इसे वास्तव में उपयोग करने की आवश्यकता महसूस नहीं हुई।

13

सी # 3.0 में, आप जब वस्तुओं बनाने के लिए एक समान प्रभाव को प्राप्त करने वस्तु initializers उपयोग कर सकते हैं।

var control = new MyControl 
{ 
    Title = "title", 
    SomeEvent += handler, 
    SomeProperty = foo, 
    Another = bar 
}; 

बजाय:

var control = new MyControl(); 
control.Title = "title"; 
control.SomeEvent += handler; 
control.SomeProperty = foo; 
control.Another = bar; 

ध्यान दें कि, हालांकि इस वाक्य रचना सी # 3.0 में पेश किया गया था, तो आप अभी भी यह 2.0 ढांचे के साथ उपयोग कर सकते हैं, यह सिर्फ वाक्यात्मक चीनी संकलक द्वारा शुरू की गई है।

+0

सच है, लेकिन आप ऑब्जेक्ट बनाते समय केवल ऐसा ही कर सकते हैं। यदि ऑब्जेक्ट पहले से मौजूद है तो कोई तंत्र नहीं है। हालांकि, अनुस्मारक के लिए धन्यवाद। –

+0

हां, धन्यवाद। मैंने आगे स्पष्ट किया कि मेरी पोस्ट में। –

8

नहीं, "साथ" कीवर्ड जानबूझकर भाषा से बाहर छोड़ा गया था।

आप संदर्भ की एक लंबी नाम है, तो आप आसानी से एक चर का उपयोग कर इसे करने के लिए एक छोटी संदर्भ बना सकते हैं, और यहां तक ​​कि यह एक सीमित दायरे दे:

{ 
    SomeClass r = Some.Lengthy.Path.To.Get.To.A.Referece; 
    r.Some = 42; 
    r.Properites = "none"; 
    r.To = 1; 
    r.Set = null; 
} 
10

यह मुहावरेदार C# नहीं है, लेकिन अगर आप वास्तव में एक with बराबर चाहते हैं, आप ऐसा कर सकता है:

Person MyPersonWithALongName = new Person(); 
MyUtils.With(MyPersonWithALongName, p => { 

    p.Name = "George"; 
    p.Address = "123 Main St"; 
    ... 

}); 

class MyUtils { 

    public static void With<T>(T x, Action<T> do) { 
     do(x); 
    } 
} 

अद्यतन:
यह मेरे लिए हुआ है कि आप तुच्छता से इस अधिक मैं बदल कर संक्षिप्त कर सकता है एक विस्तार विधि में टी, शायद इसका नाम "उर्फ" या "के रूप में" reabability के लिए:

MyPersonWithALongName.Alias(p => { 
    p.Name = "George"; 
    p.Address = "123 Main St"; 
    ... 
}); 
+5

आप टी को एक संदर्भ प्रकार ("जहां टी: कक्षा") प्रतिबंधित करना चाहते हैं, ताकि आप गलती से संरचना x की एक प्रति संपादित नहीं कर सकें –

1

इन समाधानों के लिए:

// .... 
// (class Common) 

public static void With<T>(T property, Action<T> action) { 
    action(property); 
} 

// ... 
// usage somewhere ...  
Person person = GetPerson(); 
Common.With(person, p => { p.Name = "test", p.Age = "123" }); 

यह सिर्फ हम "पी" के साथ चर aliasing कर रहे हैं। समाधान के रूप में, मुझे चर नाम को छोटा रखने के लिए काफी आसान लगता है, इस तरह के समाधान "साथ" जेनेरिक के साथ कोई लालित्य नहीं खरीदता है।

आदर्श रूप में, हम सब वाक्य रचना के कुछ नए सिरे को देखने के लिए वैसे-वैसे उपयोग कैसे कई गुणों का प्रारंभ आज काम करता है के समान है करना चाहते हैं:

Person person = new Person() { Name = "test", Age = "123" };