.NET में क्या विशेषताएं हैं?


206

.NET में क्या विशेषताएँ हैं, वे किस लिए अच्छे हैं, और मैं अपनी विशेषताएँ कैसे बनाऊँ?

जवाबों:


146

मेटाडाटा। अपनी वस्तुओं / विधियों / गुणों के बारे में डेटा।

उदाहरण के लिए, मैं एक विशेषता घोषित कर सकता हूं: डिस्प्लेऑर्डर इसलिए मैं आसानी से नियंत्रित कर सकता हूं कि UI में किस क्रम में गुण प्रदर्शित होने चाहिए। फिर मैं इसे एक कक्षा में जोड़ सकता हूं और कुछ GUI घटक लिख सकता हूं जो विशेषताओं को निकालते हैं और UI तत्वों को उचित रूप से आदेश देते हैं।

public class DisplayWrapper
{
    private UnderlyingClass underlyingObject;

    public DisplayWrapper(UnderlyingClass u)
    {
        underlyingObject = u;
    }

    [DisplayOrder(1)]
    public int SomeInt
    {
        get
        {
            return underlyingObject .SomeInt;
        }
    }

    [DisplayOrder(2)]
    public DateTime SomeDate
    {
        get
        {
            return underlyingObject .SomeDate;
        }
    }
}

जिससे यह सुनिश्चित करना कि मेरे कस्टम GUI घटकों के साथ काम करने के दौरान SomeInt को हमेशा SomeDate से पहले प्रदर्शित किया जाता है।

हालाँकि, आप उन्हें प्रत्यक्ष कोडिंग वातावरण के बाहर सबसे अधिक उपयोग करते देखेंगे। उदाहरण के लिए विंडोज डिजाइनर उन्हें बड़े पैमाने पर उपयोग करता है इसलिए यह जानता है कि कस्टम निर्मित वस्तुओं से कैसे निपटना है। BrowsableAttribute का उपयोग करना जैसे:

[Browsable(false)]
public SomeCustomType DontShowThisInTheDesigner
{
    get{/*do something*/}
}

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

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

public void SomeProfilingMethod(MethodInfo targetMethod, object target, params object[] args)
{
    bool time = true;
    foreach (Attribute a in target.GetCustomAttributes())
    {
        if (a.GetType() is NoTimingAttribute)
        {
            time = false;
            break;
        }
    }
    if (time)
    {
        StopWatch stopWatch = new StopWatch();
        stopWatch.Start();
        targetMethod.Invoke(target, args);
        stopWatch.Stop();
        HandleTimingOutput(targetMethod, stopWatch.Duration);
    }
    else
    {
        targetMethod.Invoke(target, args);
    }
}

उन्हें घोषित करना आसान है, बस एक ऐसा वर्ग बनाएं जो गुण से विरासत में मिले।

public class DisplayOrderAttribute : Attribute
{
    private int order;

    public DisplayOrderAttribute(int order)
    {
        this.order = order;
    }

    public int Order
    {
        get { return order; }
    }
}

और याद रखें कि जब आप विशेषता का उपयोग करते हैं तो आप प्रत्यय "विशेषता" को छोड़ सकते हैं संकलक आपके लिए जोड़ देगा।

नोट: विशेषताएँ स्वयं कुछ भी नहीं करती हैं - कुछ अन्य कोड होने चाहिए जो उनका उपयोग करते हैं। कभी-कभी वह कोड आपके लिए लिखा जाता है लेकिन कभी-कभी आपको इसे स्वयं लिखना होता है। उदाहरण के लिए, सी # कंपाइलर कुछ और कुछ निश्चित रूपरेखाओं के बारे में परवाह करता है, कुछ का उपयोग करता है (उदाहरण के लिए NUnit एक वर्ग पर [TestFixture] और एक विधानसभा को लोड करते समय एक परीक्षण विधि पर [TestFixture]।
तो जब अपने स्वयं के कस्टम विशेषता बनाने के बारे में पता है कि यह आपके कोड के व्यवहार को बिल्कुल भी प्रभावित नहीं करेगा। आपको दूसरे भाग को लिखने की ज़रूरत होगी जो विशेषताओं (प्रतिबिंब के माध्यम से) की जाँच करें और उन पर कार्य करें।


32
इसके लायक क्या है, यह सभी (बिल्ट इन) .NET विशेषताओं की एक सूची है: msdn.microsoft.com/en-us/library/aa311259(VS.71).aspx
wprl

1
आप अपने "SomeProfilingMethod" को एक विशेषता के रूप में कैसे उपयोग करेंगे?
रेवेल्वेस

@RayLoveless इसकी विशेषता नहीं है, SomeProfilingMethod इंस्ट्रुमेंटेशन कोड है जो प्रोफाइलिंग विशेषताओं की तलाश में है। विशेष रूप से उदाहरण में मैंने इसकी "ऑप्ट-आउट" विशेषता (NoTimingAttribute) के रूप में "ऑप्ट-इन" एक के विरोध में देख रहा था। विचार यह है कि यह सब कुछ समय है।
Quibblesome

@ प्रश्न आप कुछ जोड़ सकते हैं जैसे "गुण स्वयं से कुछ नहीं करते हैं - उनका उपयोग करने के लिए कुछ अन्य कोड होने की आवश्यकता है (युगल के बारे में संकलक, विभिन्न फ्रेमवर्क कुछ का उपयोग करते हैं)। बस विशेषता बनाने से कोड का व्यवहार प्रभावित नहीं होगा - आपको दूसरे भाग को लिखने की ज़रूरत है जो विशेषताओं (प्रतिबिंब के माध्यम से) की जाँच करें और उन पर कार्य करें "। (या मैं ऐसा कर सकता हूं यदि आप ठीक हैं)। बहुत से लोग जादुई रूप से काम करने के लिए विशेषताओं की उम्मीद करते हैं और यहां कोई भी उत्तर स्पष्ट नहीं करता है। (या केवल stackoverflow.com/questions/4879521/… जो इसे कवर करता है) से लिंक करें
अलेक्सी लेवेनकोव

केवल तभी यदि आप बिंग का उपयोग करना बंद कर दें। नाह। j / k मैं अपने प्राथमिक के रूप में DuckDuckGo का उपयोग करता हूं जो मुख्य रूप से Bing iirc का उपयोग करता है। :)
Quibblesome

36

कई लोगों ने जवाब दिया लेकिन किसी ने भी अब तक इसका उल्लेख नहीं किया है ...

विशेषताएँ प्रतिबिंब के साथ भारी उपयोग की जाती हैं। प्रतिबिंब पहले से ही बहुत धीमा है।

यह होने के रूप में अपने कस्टम विशेषताओं को चिह्नित करने के लिए बहुत सार्थक हैsealed कक्षाएं उनके क्रम के प्रदर्शन में सुधार करने के लिए।

यह विचार करना भी एक अच्छा विचार है कि इस तरह की विशेषता के लिए जगह का उपयोग करना कहां तक ​​उचित होगा, और इसके माध्यम से इंगित करने के लिए अपनी विशेषता (!) का उपयोग करें AttributeUsage। उपलब्ध विशेषता usages की सूची आपको आश्चर्यचकित कर सकती है:

  • सभा
  • मापांक
  • कक्षा
  • struct
  • enum
  • निर्माता
  • तरीका
  • संपत्ति
  • मैदान
  • प्रतिस्पर्धा
  • इंटरफेस
  • पैरामीटर
  • प्रतिनिधि
  • प्रतिलाभ की मात्रा
  • GenericParameter
  • सब

यह भी अच्छा है कि एट्रीब्यूट्स एट्रिब्यूट, एट्रीब्यूट्स फ़ीचर के हस्ताक्षर का हिस्सा है। परिपत्र निर्भरता के लिए वाह!

[AttributeUsageAttribute(AttributeTargets.Class, Inherited = true)]
public sealed class AttributeUsageAttribute : Attribute

13

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

एक विशेषता बनाकर शुरू करें:

[AttributeUsage(AttributeTargets.Class, AllowMultiple=false, Inherited=true)]
public class SortOrderAttribute : Attribute
{
    public int SortOrder { get; set; }

    public SortOrderAttribute(int sortOrder)
    {
        this.SortOrder = sortOrder;
    }
}

सभी विशेषता वर्गों में मान्य होने के लिए प्रत्यय "गुण" होना चाहिए।
ऐसा करने के बाद, विशेषता का उपयोग करने वाला एक वर्ग बनाएं।

[SortOrder(23)]
public class MyClass
{
    public MyClass()
    {
    }
}

अब आप निम्न करके एक विशिष्ट वर्ग की जाँच कर सकते हैं ' SortOrderAttribute(यदि यह एक है):

public class MyInvestigatorClass
{
    public void InvestigateTheAttribute()
    {
        // Get the type object for the class that is using
        // the attribute.
        Type type = typeof(MyClass);

        // Get all custom attributes for the type.
        object[] attributes = type.GetCustomAttributes(
            typeof(SortOrderAttribute), true);

        // Now let's make sure that we got at least one attribute.
        if (attributes != null && attributes.Length > 0)
        {
            // Get the first attribute in the list of custom attributes
            // that is of the type "SortOrderAttribute". This should only
            // be one since we said "AllowMultiple=false".
            SortOrderAttribute attribute = 
                attributes[0] as SortOrderAttribute;

            // Now we can get the sort order for the class "MyClass".
            int sortOrder = attribute.SortOrder;
        }
    }
}

यदि आप इसके बारे में अधिक पढ़ना चाहते हैं, तो आप हमेशा MSDN की जांच कर सकते हैं जिसमें बहुत अच्छा विवरण है।
मुझे आशा है कि इससे आपको मदद मिली!


5

एक विशेषता एक वर्ग है जिसमें कुछ बिट कार्यक्षमता होती है जिसे आप अपने कोड में ऑब्जेक्ट पर लागू कर सकते हैं। एक बनाने के लिए, सिस्टम से विरासत में मिला एक वर्ग बनाएं।

जैसा कि वे अच्छे के लिए कर रहे हैं ... उनके लिए लगभग असीम उपयोग हैं।

http://www.codeproject.com/KB/cs/dotnetattributes.aspx


1
"कार्यक्षमता" यहाँ गलत शब्द है; वे मेटाडाटा कर रहे हैं, नहीं कार्यक्षमता
मार्क Gravell

5

विशेषताएँ वर्ग, विधियों या विधानसभाओं पर लागू मेटाडेटा की तरह हैं।

वे किसी भी संख्या में चीजों के लिए अच्छे हैं (डिबगर विज़ुअलाइज़ेशन, चीजों को अप्रचलित के रूप में चिह्नित करना, चीजों को क्रमिक रूप से चिह्नित करना, सूची अंतहीन है)।

पाई के रूप में अपने स्वयं के कस्टम बनाना आसान है। यहाँ से प्रारंभ करें:

http://msdn.microsoft.com/en-us/library/sw480ze8(VS.71).aspx


5

वर्तमान में मैं जिस प्रोजेक्ट पर काम कर रहा हूं, उसमें विभिन्न फ्लेवर की यूआई ऑब्जेक्ट्स का एक सेट है और इन वस्तुओं को असेंबली करने के लिए पेज बनाने के लिए इन ऑब्जेक्ट्स को असेंबली करने के लिए एक एडिटर असेंबली, DevStudio में फॉर्म डिजाइनर की तरह है। ये वस्तुएं अपने स्वयं के विधानसभा में मौजूद हैं और प्रत्येक वस्तु एक वर्ग है जो UserControlएक कस्टम विशेषता है। इस विशेषता को इस तरह परिभाषित किया गया है:

[AttributeUsage (AttributeTargets::Class)]
public ref class ControlDescriptionAttribute : Attribute
{
public:
  ControlDescriptionAttribute (String ^name, String ^description) :
    _name (name),
    _description (description)
  {
  }

  property String ^Name
  {
    String ^get () { return _name; }
  }

  property String ^Description
  {
    String ^get () { return _description; }
  }

private:
  String
    ^ _name,
    ^ _description;
};

और मैं इसे इस तरह एक वर्ग पर लागू करता हूं:

[ControlDescription ("Pie Chart", "Displays a pie chart")]
public ref class PieControl sealed : UserControl
{
  // stuff
};

जो पिछले पोस्टर ने कहा है।

विशेषता का उपयोग करने के लिए, संपादक में Generic::List <Type>नियंत्रण प्रकार होते हैं। एक सूची बॉक्स है जिसे उपयोगकर्ता नियंत्रण की आवृत्ति बनाने के लिए पृष्ठ पर से खींच सकता है और छोड़ सकता है। सूची बॉक्स को पॉप्युलेट करने के लिए, मुझे ControlDescriptionAttributeनियंत्रण के लिए मिलता है और सूची में एक प्रविष्टि भरें:

// done for each control type
array <Object ^>
  // get all the custom attributes
  ^attributes = controltype->GetCustomAttributes (true);

Type
  // this is the one we're interested in
  ^attributetype = ECMMainPageDisplay::ControlDescriptionAttribute::typeid;

// iterate over the custom attributes
for each (Object ^attribute in attributes)
{
  if (attributetype->IsInstanceOfType (attribute))
  {
    ECMMainPageDisplay::ControlDescriptionAttribute
      ^description = safe_cast <ECMMainPageDisplay::ControlDescriptionAttribute ^> (attribute);

    // get the name and description and create an entry in the list
    ListViewItem
      ^item = gcnew ListViewItem (description->Name);

    item->Tag = controltype->Name;
    item->SubItems->Add (description->Description);

    mcontrols->Items->Add (item);
    break;
  }
}

नोट: ऊपर C ++ / CLI है, लेकिन C # में बदलना मुश्किल नहीं है (हाँ, मुझे पता है, C ++ / CLI एक घृणा है लेकिन यह है कि मुझे क्या काम करना है :-()

आप ज्यादातर चीजों पर विशेषता डाल सकते हैं और पूर्वनिर्धारित विशेषताओं की पूरी श्रृंखला है। ऊपर उल्लिखित संपादक संपत्ति पर वर्णन करने वाले गुणों पर कस्टम विशेषताओं की तलाश करता है और इसे कैसे संपादित करें।

एक बार जब आप पूरा विचार प्राप्त करते हैं, तो आप आश्चर्यचकित होंगे कि आप कभी उनके बिना कैसे रहते थे।


4

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

विशेषताओं का उपयोग करना और उनके उपयोग के लिए उपयुक्त परिदृश्यों को जानना काम का थोक है।


3

विशेषताएँ, अनिवार्य रूप से, डेटा के बिट्स हैं जिन्हें आप अपने प्रकारों (कक्षाओं, विधियों, घटनाओं, एनम आदि) से जोड़ना चाहते हैं ।

विचार यह है कि रन टाइम पर कुछ अन्य प्रकार / फ्रेमवर्क / टूल आपके प्रश्न का जवाब देंगे प्रकार को विशेषता में जानकारी के लिए और उस पर कार्य करेंगे।

इसलिए, उदाहरण के लिए, विजुअल स्टूडियो एक 3 पार्टी कंट्रोल पर विशेषताओं को क्वेरी कर सकता है ताकि यह पता चल सके कि डिजाइन समय में प्रॉपर्टी फलक में नियंत्रण के कौन से गुण दिखाई देने चाहिए।

विशेषताएँ भी ऑब्जेक्ट के व्यावसायिक तर्क को प्रभावित किए बिना ऑब्जेक्ट को सजाने और उन्हें जोड़ने, सत्यापन, लॉगिंग आदि के आधार पर रन टाइम पर ऑब्जेक्ट्स को इंजेक्ट / हेरफेर करने के लिए एस्पेक्ट ओरिएंटेड प्रोग्रामिंग में उपयोग किया जा सकता है।


2

आप प्रत्येक उपवर्ग के लिए बार-बार एक ही कोड लिखने के बिना उप-वर्गों में टैग मूल्यों को परिभाषित करने के लिए एक सरल तरीके के रूप में कस्टम विशेषताओं का उपयोग कर सकते हैं। मुझे जॉन वॉटरर्स द्वारा अपने स्वयं के कोड में कस्टम विशेषताओं को परिभाषित करने और उपयोग करने के लिए एक अच्छा संक्षिप्त उदाहरण मिला

Http://msdn.microsoft.com/en-us/library/aa288454(VS.71).aspx पर एक ट्यूटोरियल है


2

एक विशेषता बनाना शुरू करने के लिए, एक C # स्रोत फ़ाइल खोलें, टाइप करें attributeऔर हिट करें [TAB]। यह एक नई विशेषता के लिए एक टेम्पलेट का विस्तार करेगा।


6
यह प्रश्न का उत्तर कैसे देता है? यह एक टिप्पणी होनी चाहिए, एक जवाब नहीं।
gdoron

1

विशेषताएँ भी आमतौर पर पहलू उन्मुख प्रोग्रामिंग के लिए उपयोग किया जाता है। इस उदाहरण के लिए PostSharp प्रोजेक्ट देखें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.