2010-09-09 23 views
10
  • सी # में गुणों का उद्देश्य क्या है?सी # में गुणों का उद्देश्य क्या है?

  • मुझे कैसे पता चलेगा कि विशेष कार्यक्षमता के लिए किस विशेषता का उपयोग करना है?

  • मैं उन्हें C# में गतिशील रूप से कैसे जोड़ सकता हूं?

  • कस्टम विशेषताएं क्या हैं?

उत्तर

4

गुण एक घोषणात्मक प्रोग्रामिंग मॉडल के लिए उपयोग किया जाता है।

गुण किसी भी कार्यक्षमता को मजबूर नहीं करते हैं (जब तक कि बॉक्स से बाहर नहीं)। बॉक्स के बाहर के गुणों के लिए msdn पर प्रलेखन को पढ़ें। अपने स्वयं के गुणों के लिए आपको एक कोड/विधि इत्यादि में एक विशेषता होने पर कोड लिखने की आवश्यकता है।

मुझे नहीं लगता कि विशेषताएं गतिशील रूप से जोड़े गए हैं। हालांकि वे गतिशील रूप से पढ़ रहे हैं। वे मेटाडेटा हैं इसलिए संकलन-समय पर जोड़े गए हैं। इसे जांचें: Can attributes be added dynamically in C#?

कस्टम विशेषताएँ वे हैं जिन्हें आप के साथ अपनी कक्षाएं बनाते हैं और टैग करते हैं। एक विशेषता बनाने के लिए आपको सिस्टम (एट्रिब्यूट के लिए) बनाने की आवश्यकता है जो System.Attribute से प्राप्त होता है। इस जाँच करें: आदि http://msdn.microsoft.com/en-us/library/sw480ze8.aspx

9
  1. गुण एक वर्ग है, समारोह के बारे में अतिरिक्त जानकारी जोड़ने के लिए होती हैं, संकलनकर्ता कभी कभी विशेष बातें करते हैं, जब वे एक विशेषता देखते हैं। प्रोग्राम चल रहा है, जबकि अन्य विशेषताओं पुस्तकालयों द्वारा देखा जाता है।

  2. अपनी इच्छित कार्यक्षमता के लिए प्रलेखन को देखकर प्रारंभ करें। यह सूचीबद्ध करना चाहिए कि कौन से गुण आवश्यक हैं।

  3. नहीं। कोड संकलित होने से पहले ही लागू किए जा सकते हैं।

  4. यह केवल एक विशेषता है जिसे आपने स्वयं बनाया है जो .NET के साथ आया था।

1

विशेषताएँ आपके वर्गों और विधियों, गुणों और आपके वर्गों के अंदर की घटनाओं के बारे में मेटा डेटा प्रदान करने के लिए उपयोग की जाती हैं।

कुछ सबसे आम विशेषताओं का उपयोग कक्षाओं में गुणों के बारे में डिज़ाइनर जानकारी को बताने के लिए किया जाता है, जैसे Browsable और Description। यह मेटा-डेटा तब प्रॉपर्टीग्रिड द्वारा उपयोग किया जाता है। विशेषताओं के अन्य उदाहरण Serializable या Obsolete क्रमबद्धता के दौरान उपयोग किए गए गुण या कोड तत्वों को अप्रचलित के रूप में चिह्नित करने के लिए होंगे।

आप [AttributeName (पैरामीटर 1, ...)] वाक्यविन्यास का उपयोग करके कक्षाओं, गुणों, विधियों और घटनाओं में विशेषताओं को जोड़ सकते हैं।

कस्टम विशेषताएँ उन गुणों का संदर्भ देती हैं जो System.Attribute से प्राप्त होती हैं जो .NET Framework में मानक विशेषताओं नहीं हैं।

3

मेटा-प्रोग्रामिंग के लिए विशेषताओं का उपयोग किया जाता है।मेटा-प्रोग्रामिंग आपको रनटाइम पर आपके कोड के साथ गतिशीलता प्राप्त करने में मदद करता है। मान लें कि आपके कक्षा में 10 प्रोप हैं और आप कुछ कारणों से केवल कुछ विशिष्ट प्रोप पढ़ना चाहते हैं, ऐसा करने के लिए आप उन प्रोपों और रनटाइम पर कुछ विशेष विशेषताओं को प्रतिबिंब के माध्यम से लागू करेंगे, आप केवल उन प्रोप को फ़िल्टर करने के लिए कहेंगे गुण और फिर उन प्रोपों पर अपना काम करते हैं। यह तो केवल एक उदाहरण है।

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

+0

महान स्पष्टीकरण और उदाहरण के लिए, मैं सिर्फ इस तरह के मामले है अभी, इसलिए धन्यवाद ! – greenoldman

6

जब आप अपना कोड लिखते हैं तो आप "क्या?" का जवाब देते हैं प्रश्न:

  1. क्या करना है? (विधियों)
  2. स्टोर करने के लिए क्या? (फ़ील्ड और गुण)
  3. क्या है? (कक्षा पदानुक्रम)

आदि गुण इस प्रश्न में एक और आयाम जोड़ते हैं। वे जवाब देते हैं "कैसे?" सवाल। और "कैसे?" का जवाब सवाल संकलक

[ThreadStatic] 
private static RequestContext context; // field which will be different for every thread 

के लिए या किसी अन्य कोड जो प्रतिबिंब के माध्यम से तुम्हारा विश्लेषण के लिए आईडीई के लिए महत्वपूर्ण हो सकता है,

[Browsable(false)] 
public string NotImportantField { get; set; } // property which will not be displayed in VS 

[XmlIgnore] 
public string NotSerializableField { get; set; } // property which will not be xml-serialized 

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

आपके पहले प्रश्न के बारे में, अच्छी तरह से, हम कैसे जानते हैं कि किसी विशेष परिणाम के लिए किस विधि को कॉल करना है? .NET डेवलपर होने के फायदों में से एक यह है कि सब कुछ पूरी तरह से दस्तावेज किया गया है। :)

0

गुण का इस्तेमाल किया है जब आप अपने प्रोग्रामिंग बयानों तक रोकें के कुछ प्रकार निर्दिष्ट करना चाहते हैं कर रहे हैं:

Exapmple:

[StructLayout(LayoutKind::Sequential)] 
value struct Point 
{ 
public: 
    int x; 
    int y; 
}; 

ऊपर आप परिभाषित कर रहे हैं कि संरचना एक अनुक्रमिक एक होना चाहिए।

एक और उदाहरण है:

[DllImport("user32.dll",CallingConvention=CallingConvention::StdCall)] 

यहाँ आप एक dll विशेषताओं का उपयोग करके DllImport का उपयोग कर आयात करने के लिए निर्दिष्ट करते हैं। मुझे उम्मीद है कि आप यह जानने में सक्षम हैं कि विशेषता का उद्देश्य क्या है।

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

0

यदि आप एक बहुत ही उपयोगी उदाहरण चाहते हैं कि गुण उपयोगी हो सकते हैं, और उन्हें एक्सेस करने के लिए प्रतिबिंब कोड कैसे करें, Enum ToString देखें। उस कोड का उपयोग करना, यह आपके enum करने के लिए कोई ComboBox बाध्य करने के लिए typesafe विकल्प है, साथ ही सुंदर मानव पठनीय विवरण के लिए आसान हो जाता है:

public static void ComboItemsFromEnum<EnumType>(ComboBox combobox) where EnumType : struct 
{ 
    combobox.FormattingEnabled = true; 
    foreach (object enumVal in System.Enum.GetValues(typeof(EnumType))) 
    { 
     combobox.Items.Add(enumVal); 
    } 
    combobox.Format += delegate(object sender, ListControlConvertEventArgs e) 
    { 
     e.Value = GetDescription<EnumType>(e.Value); 
    }; 
} 
संबंधित मुद्दे