2010-04-13 6 views
8

नई वीबी 2010 सुविधाओं को देखते हुए, मैंने Auto-Implemented Properties के लिए समर्थन पर ठोकर खाई।क्यों सी # स्वचालित गुण VB 2010 जैसे डिफ़ॉल्ट मानों का समर्थन नहीं करते हैं?

जब से मैं के साथ सी # काम कर रहा हूँ, यह काफी परिचित लग रहा था, लेकिन मैंने देखा है कि वीबी एक सुविधा मैं सी # में है करने के लिए प्यार होता जोड़ा था:

Public Class Person 

    Property Name As String = "Scott Guthrie" 
    Property Age as Integer = 35 

End Class 
: ऑटो कार्यान्वित संपत्ति के लिए एक मनमाना डिफ़ॉल्ट मान सेट

मुझे वास्तव में सी # में ऑटो-गुणों का साफ उपयोग पसंद है। यह हमें बैकिंग फ़ील्ड पेश करने और संपत्ति को हुक करने का प्रयास हर बार जब हमें केवल डिफ़ॉल्ट मान की आवश्यकता होती है, जिससे कोड को अनावश्यक रूप से अव्यवस्थित कर दिया जाता है।

मैं सोच रहा था कि यह सी # में क्यों पेश नहीं किया गया था? ऐसा करने के लिए तर्क क्या हो सकता है? क्या एक वाक्यविन्यास चर्चा चल रही है, या क्या इसे लागू करने के लिए तकनीकी सीमाएं हैं?

+0

बैकिंग फ़ील्ड क्यों, इसके लिए कोई आवश्यकता नहीं है। लेकिन मैं मानता हूं कि यह अव्यवस्था में जोड़ता है। – Abel

+0

पीएस: आप पहले पूछने वाले नहीं थे, अधिक चर्चा के लिए इसे जांचें: http://stackoverflow.com/questions/169220/initializing-c-auto-properties – Abel

+0

@Abel: मुझे यह पोस्ट देखना याद है। मुझे पता है कि यह संभव नहीं है और इसके आसपास कैसे काम करना है, लेकिन मैं वास्तविक तर्क के लिए उत्सुक था कि क्यों वीबी इसका समर्थन करता है और सी # नहीं (अभी तक)। –

उत्तर

3
(आप इस तरह के <DefaultValue(...)> के रूप में मेटाडाटा के साथ यह सजाने के लिए जा रहे हैं, खासकर अगर)

के बारे में क्या:

public class Person 
{ 
    public Person() 
    { 
     this.Name = "Scott Guthrie"; 
     this.Age = 35; 
    } 
    public string Name { get; set; } 
    public string Age { get; set; } 
} 
व्यवहार में

, कि एक ही करने के लिए नीचे आता है और इतना अतिरिक्त काम नहीं है, मेरा मानना ​​है कि। लेकिन शायद, एक बार एक लंबे समय में के लिए, वीबी स्पष्ट तो सी # ... ;-)

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

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

संपादित करें:here's what Microsoft says about it। संक्षेप में, सी # 4.0 के लिए नहीं, लेकिन शायद सी # 5.0? इसके अलावा:

"यह नहीं के रूप में आसान के रूप में यह है, हालांकि लगता है: अगली बात आप चाहते हैं निर्माता समर्थन क्षेत्र प्रारंभ करने के लिए है, लेकिन यह केवल ऐसा कर सकते हैं सेटर, के माध्यम से जो हो सकता है कि जो आप चाहते हैं हो।"

और (सिर्फ एक टिप्पणीकार):

" प्रारंभ या निर्माता की कमी नियंत्रण एक संदर्भ प्रकार लौटने संपत्तियों के लिए सुविधा व्यावहारिक रूप से बेकार बना देता है "

+0

जेम्स कुरान ने उस उत्तर पर टिप्पणी करते हुए टिप्पणी की - "DefaultValueAttribute किसी संपत्ति का मान निर्धारित नहीं करता है। यह सब विजुअल स्टूडियो को बताता है डिफ़ॉल्ट मान क्या होना चाहिए, ताकि प्रॉपर्टी विंडो में, उसे बोल्ड किया जाएगा यदि यह उस मान पर सेट नहीं है। यह किसी भी तरह से मान को नहीं बदलता है " –

+0

अन्य थ्रेड में टिप्पणी देखें:" DefaultValueAttribute सेट नहीं करता है किसी संपत्ति का मूल्य। यह सब विजुअल स्टूडियो को बताता है कि डिफ़ॉल्ट मान क्या होना चाहिए, ताकि संपत्ति विंडो में, यदि वह उस मान पर सेट नहीं है तो उसे बोल्ड किया जाएगा। यह किसी भी तरह से मान को नहीं बदलता है। " –

+0

यदि मुझे गलत नहीं है, तो 'DefaultValue' केवल संपत्ति फलक में विजुअल स्टूडियो के लिए मान सेट करता है, लेकिन निष्पादन समय पर मान सेट नहीं करता है। – Shimrod

10

क्यों उन्हें कन्स्ट्रक्टर में डिफ़ॉल्ट नहीं है? यही भी इसके लिए है।

+0

बिल्कुल। सटीक। – Finglas

+1

यही वह है जो मैं आमतौर पर करता हूं, लेकिन कभी-कभी घोषणा में चूक को देखने में सहायक हो सकता है। –

+2

आपके पास एकाधिक कन्स्ट्रक्टर हो सकते हैं, इसलिए एकाधिक डिफ़ॉल्ट। इसलिए यह एक अच्छा समाधान है, लेकिन यह एक डिफ़ॉल्ट मान की आपूर्ति के रूप में साफ नहीं है। –

0

जब तक मैं माइक्रोसॉफ्ट नहीं हूं, तो मैं सुझाव दूंगा कि अनुमानित लाभ सुविधा को लागू करने, परीक्षण करने और समर्थन करने की लागत से कम था।

बेशक

, तो आप सिर्फ एक निर्माता की घोषणा के द्वारा मूलभूत मूल्यों सेट कर सकते हैं, लेकिन मैं इस बात से सहमत है कि वीबी वाक्य रचना एक छोटे से स्पष्ट है

0

मेरे पास एक ऑटो-प्रॉपर्टी को एक संपत्ति-बैकिंग-फील्ड में परिवर्तित करने के कठिन व्यवसाय का समाधान है: मेरा एडिन , AtomineerUtils आपके लिए एक सिंगल कीप्रेस के साथ रीफैक्टरिंग करेगा।

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