2010-06-30 11 views
5

मैंने पढ़ा है कि SO पर फ़ील्ड के बजाय गुणों का उपयोग करने के अच्छे कारण हैं। तो अब मैं अपने कोड को गुणों का उपयोग करने के लिए फ़ील्ड का उपयोग करने से बदलना चाहता हूं।क्या सी # में किसी संपत्ति के लिए डिफ़ॉल्ट मान सेट करने का कोई शानदार तरीका है?

कक्षा के एक उदाहरण फ़ील्ड के लिए, मैं एक डिफ़ॉल्ट मान निर्धारित कर सकता हूं।

int speed = 100; 

बराबर संपत्ति है, जो मुझे लगता है कि है: उदाहरण के लिए:

int Speed { get; set; } 

मेरे समझ है कि स्पीड संपत्ति शून्य करने के लिए initialised किया जाएगा जब वर्ग instantiated जाता है। मैं अपने कोड को आसानी से अपडेट करने के लिए डिफ़ॉल्ट मान सेट करने का तरीका जानने में असमर्थ हूं। क्या संपत्ति के लिए डिफ़ॉल्ट मूल्य प्रदान करने का कोई शानदार तरीका है?

ऐसा लगता है कि ऐसा करने के लिए एक कन्स्ट्रक्टर का उपयोग किए बिना ऐसा करने का एक शानदार तरीका होना चाहिए, लेकिन मुझे यह पता नहीं चल सकता कि कैसे।

+0

क्या एक निर्माता का उपयोग कर के साथ गलत क्या है? या एक ऑटोप्रोपर्टी के बजाय मैन्युअल रूप से परिभाषित बैकिंग फ़ील्ड वाली संपत्ति का उपयोग करना? –

+0

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

+0

सी # 6 में नया: [ऑटो-गुणों के लिए प्रारंभकर्ता] (https://github.com/dotnet/roslyn/wiki/New- भाषा- विशेषताएं-in-C%23-6#auto-property-enhancements) –

उत्तर

7

बेस्ट शर्त की तरह, एक सामान्य पुराने ढंग का क्षेत्र समर्थित संपत्ति करना है:

private int _speed = 100; 
public int Speed { get { return _speed; } set { _speed = value; } } 
+0

धन्यवाद कोड के लिए यह काफी सुरुचिपूर्ण है और मुझे एक कन्स्ट्रक्टर का उपयोग करने की ज़रूरत नहीं है। प्रतिभाशाली। –

+0

कोई जांच नहीं। यह है कि आप .NET 3.0 से पहले लिखे गए कोड के लिए हर समय देखेंगे। 3.0 के साथ, ऑटो-प्रॉपर्टी पेश की गई थी, लेकिन आप जिस समस्या को लाए थे, उसमें आप भाग लेते हैं, जहां आप कन्स्ट्रक्टर का उपयोग किए बिना डिफ़ॉल्ट मान को परिभाषित नहीं कर सकते हैं। –

+0

मुझे अभी भी गुण करने का पुराना तरीका पसंद है, हालांकि यह भ्रम पैदा कर सकता है क्योंकि आप नहीं जानते कि कक्षा के अंदर से मूल्यु को प्राप्त करने/सेट करने का तरीका क्या है। क्या आप आवृत्ति चर का उपयोग करते हैं या आप संपत्ति का उपयोग करते हैं? –

1

आपको कन्स्ट्रक्टर में संपत्ति के लिए डिफ़ॉल्ट मान सेट करना होगा। स्वचालित गुणों के लिए इसके अलावा इसे करने का कोई दूसरा तरीका नहीं है क्योंकि स्वत: प्रोप के लिए फ़ील्ड संकलित समय पर घोषित किए जाते हैं और गेटर/सेटर के भीतर बदल जाते हैं। हालांकि स्पष्ट गुणों में, आप उस क्षेत्र को प्रारंभ कर सकते हैं, जिसे संपत्ति को उत्तर में उल्लिखित जो के रूप में पढ़ने या लिखने के लिए उपयोग किया जाता है।

0

निर्माता एक ऑटो संपत्ति का प्रारंभिक मूल्य निर्धारित करने के लिए एक ही रास्ता है।

1

CciSharpDefaultValue attribute का समर्थन करता है, जो ऑटो गुणों पर डिफ़ॉल्ट मान रखता है। चाहे सीसीएसएचआरपी एक "सुरुचिपूर्ण" समाधान के रूप में योग्य हो, हालांकि, राय का विषय है (यह एक पोस्ट-कंपाइलर के रूप में कार्य करता है जो बाइनरी में आईएल को संपादित करता है)।

2

मैं जिस डिज़ाइन-पैटर्न का उपयोग करता हूं, जिसका उपयोग माइक्रोसॉफ्ट के विंडोज़ में किया जाता है। फर्म नियंत्रण और अन्य .NET क्लासेस। इसके अलावा, मेरी समझ से, नियंत्रक के बाहर प्रारंभिकरण कक्षा कोड को अनुकूलित करने के लिए बस-समय-समय संकलक की अनुमति देता है।

public class Foo { 
    public static const int DefaultSpeed = 100; 
    private int _speed = DefaultSpeed; 
    [DefaultValue(DefaultSpeed)] 
    public int Speed { get { return _speed; } set { _speed = value; } } 
} 

public class Foo { 
     public static Color DefaultForecolor { get {return SystemColors.WindowText; }} 
     private Color _forecolor = DefaultForecolor; 
     [DefaultValue(DefaultForeColor)] 
     public Color Forecolor { get { return _forecolor; } set { _forecolor = value; } } 
    }