2009-01-21 11 views
5

मुझे बताया गया था कि ऑटो-कार्यान्वित गुणों पर सी # विशेषताओं की अनुमति नहीं है। क्या यह सच है? यदि ऐसा है तो क्यों?ऑटो-लागू गुण गुणों का समर्थन करते हैं?

संपादित करें: मुझे यह जानकारी LINQ पर एक लोकप्रिय पुस्तक से मिली है और यह विश्वास नहीं कर सका! संपादित करें: LINQ पॉल किमेल जहां वे कहते हैं द्वारा Unleashed का पेज 34 देखें "गुण स्वत: लागू किया संपत्तियों पर अनुमति नहीं है, इसलिए अपने खुद के रोल करता है, तो आप एक विशेषता की जरूरत"

+0

क्या आप कह सकते हैं * बिल्कुल * जानकारी क्या है? (मुझे लगता है कि किताब, बीटीडब्ल्यू के लिए नाम और संदर्भ देना उचित होगा) –

+0

टेक्स्ट और टूल्स में - इसे विश्वास करने के लिए उपयोग करें। हम सब गलतियाँ करते हैं। मुझे उस दिन वापस याद है जब टर्बो सी ++ 1.0 कंपाइलर में कॉपी कन्स्ट्रक्टर (या उससे संबंधित कुछ) पर एक आंतरिक मेमोरी रिसाव था। मुझे विश्वास नहीं था कि यह संकलक की गलती थी और स्रोत कोड में गलती नहीं होने तक मैंने इसे साबित कर दिया। उन्होंने इसे अगले संस्करण में तय किया। –

उत्तर

7

वह गलत है साबित करने के लिए सबसे आसान तरीका है बस इसे परीक्षण करने के लिए है:

using System; 
using System.ComponentModel; 
using System.Reflection; 

class Test 
{ 
    [Description("Auto-implemented property")] 
    public static string Foo { get; set; } 

    static void Main(string[] args) 
    { 
     var property = typeof(Test).GetProperty("Foo"); 
     var attributes = property.GetCustomAttributes 
       (typeof(DescriptionAttribute), false); 

     foreach (DescriptionAttribute description in attributes) 
     { 
      Console.WriteLine(description.Description); 
     } 
    } 
} 

मैं सुझाव है कि आप लेखक ईमेल तो वह छोटे काल के लिये के रूप में प्रकाशित कर सकते हैं। अगर उनका मतलब है कि आप फ़ील्ड पर एक विशेषता लागू नहीं कर सकते हैं, तो इससे उन्हें अधिक सावधानीपूर्वक व्याख्या करने का मौका मिलेगा।

12

आप बिना स्वत: गुणों के गुण लागू कर सकते हैं एक समस्या।

MSDN से

उद्धरण:

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

1

ध्यान दें कि किसी भी स्वचालित संपत्ति में कंपेलर जेनरेटेड एट्रिब्यूट भी लागू होगा।

3

मुझे लगता है कि लेखक का मतलब है कि आप निजी बैकिंग फ़ील्ड में कस्टम विशेषताओं को लागू नहीं कर सकते हैं। उदाहरण के लिए, अगर आप गैर धारावाहिक के रूप में स्वत: संपत्ति में चिह्नित करना चाहते हैं, तो आप ऐसा कर सकते हैं नहीं:

[Serializable] 
public class MyClass 
{ 
    [field:NonSerializedAttribute()] 
    public int Id 
    { 
     get; 
     private set; 
    } 
} 

इस कोड को संकलित करता है, लेकिन यह काम नहीं करता। आप संपत्ति के लिए विशेषता लागू कर सकते हैं, लेकिन इसे बैकिंग फ़ील्ड के लिए लागू नहीं कर सकता है।

+0

यह सबसे अच्छा नहीं है। हमारे पास पहले से ही 'फ़ील्ड' निर्देश है! –

+0

टिप्पणी प्राप्त नहीं कर सकता :) हमारे पास 'फ़ील्ड' है, निर्देश है, लेकिन यह निर्देश बैकिंग फ़ील्ड के साथ संपत्ति के लिए कुछ भी नहीं करेगा। –

+1

मेरी माफ़ी! मेरा मतलब था कि मैं आपके उदाहरण में वाक्यविन्यास कामना करता हूं :) –

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