अधिकांश उपयोगी विशेषताएँ [बंद]


784

मुझे पता है कि विशेषताएँ अत्यंत उपयोगी हैं। कुछ पूर्वनिर्धारित हैं जैसे कि [Browsable(false)]आप गुण टैब में गुणों को छिपाने की अनुमति देते हैं। यहाँ एक अच्छा प्रश्न है जो बताते हैं कि विशेषताएँ: .NET में विशेषताएँ क्या हैं?

पूर्वनिर्धारित विशेषताएँ (और उनके नामस्थान) क्या आप वास्तव में अपनी परियोजनाओं में उपयोग करते हैं?


27
क्या सवाल है? , संपूर्ण पृष्ठ अद्भुत स्पष्टीकरण के साथ सुंदर उत्तरों के साथ बह निकला है। जब मैं इस के माध्यम से पढ़ रहा हूं, तो मुझे कई विशेषज्ञों के साक्षात्कार के बारे में अनुभव मिला। प्रश्न के लिए +100।
मुथु गणपति नाथन

मैं मानता हूं, इस तरह के सवाल सबसे मूल्यवान हैं - एसओ को कम उपयोगी बनाता है ताकि यह बंद हो जाए।
डेविड थिएलेन

जवाबों:


669

[DebuggerDisplay]जब आप डीबगिंग के दौरान टाइप के उदाहरण पर माउस ले जाते हैं, तो एक प्रकार के अनुकूलित आउटपुट को देखने के लिए वास्तव में उपयोगी हो सकता है। उदाहरण:

[DebuggerDisplay("FirstName={FirstName}, LastName={LastName}")]
class Customer
{
    public string FirstName;
    public string LastName;
}

डीबगर में यह दिखना चाहिए:

वैकल्पिक शब्द

इसके अलावा, यह ध्यान देने योग्य है कि संपत्ति सेट के [WebMethod]साथ विशेषता CacheDurationवेब सेवा पद्धति के अनावश्यक निष्पादन से बच सकती है।


62
वाह, यह जानना वास्तव में अच्छा है। मैंने आमतौर पर ToString को ओवरराइड करके एक ही काम पूरा किया है, लेकिन यह बेहतर है।
ब्रायन

17
इस से सावधान रहें, यह ToString की तुलना में आपके CPU से बहुत बड़ा हिस्सा काटता है।
निकोला रेडोसावलजेविवि

1
विधियों का परिणाम प्रदर्शित करने के लिए आप इसका उपयोग भी कर सकते हैं। यह एक बहुत भ्रामक डिबगिंग अनुभव के लिए बना सकता है यदि विधि (या संपत्ति-प्राप्त) के दुष्प्रभाव हैं।
यविन्दर स्कार

4
@ NikolaRadosavljević यह केवल डिबगिंग के दौरान CPU शक्ति अप ले जाएगा
Nickolay Kondratyev

2
@ निकोलय कोंडरायेव: मैं सभी भारतीय नौसेना पोत और बहिष्कार को नहीं जानता, लेकिन आप निम्नलिखित वेब सेवा सर्वोत्तम प्रथाओं पर एक नज़र डाल सकते हैं जो आपको कुछ निष्कर्षों पर ले जा सकती हैं: blogs.msdn.com/b/jaredpar/archive/2011/03 18 /…
निकोला रादोवालजेवि

273

System.Obsoleteमेरी राय में, ढांचे में सबसे उपयोगी विशेषताओं में से एक है। कोड के बारे में चेतावनी देने की क्षमता जो अब उपयोग नहीं की जानी चाहिए, बहुत उपयोगी है। मुझे डेवलपर्स को यह बताने का एक तरीका पसंद है कि कुछ का उपयोग नहीं किया जाना चाहिए, साथ ही यह समझाने का तरीका भी होना चाहिए कि कुछ करने के बेहतर / नए तरीके को इंगित करें।

Conditional attributeडिबग उपयोग के लिए भी बहुत आसान है। यह आपको डिबग उद्देश्यों के लिए अपने कोड में उन तरीकों को जोड़ने की अनुमति देता है जो आपके द्वारा रिलीज़ के लिए समाधान बनाने पर संकलित नहीं होंगे।

तब वेब नियंत्रणों के लिए बहुत सारे गुण हैं जो मुझे उपयोगी लगते हैं, लेकिन वे अधिक विशिष्ट हैं और मैंने जो भी पाया है उससे सर्वर नियंत्रण के विकास के बाहर कोई उपयोग नहीं है।


50
आप System.b में से एक पैरामीटर के रूप में "सही" पास कर सकते हैं। अप्रचलित जिसके कारण चेतावनी एक त्रुटि बन जाती है इसलिए बिल्ड को तोड़ना। जाहिर है यह एक बार किया जाना चाहिए जब आप सभी चेतावनियों को साफ कर चुके हों। :)
एड्रियन क्लार्क

14
एक बार जब आप सभी चेतावनियों को साफ कर लेते हैं, तो क्या सिर्फ विधि को हटाना बेहतर नहीं होगा?
पेड्रो

10
@Proro: कभी-कभी आप पश्चगामी संगतता कारणों से नहीं कर सकते। यदि यह निजी और अप्रयुक्त है, तो इसे हटा दें।
फंटियस

3
@ अपवाद को फेंकना कई कारणों से एक बुरा विचार होगा, # 1 जा रहा है कि अप्रचलित () का उपयोग करने का मुख्य कारण यह है कि आप संकलित कोड को एक संक्रमण चरण में काम करते हुए रख सकते हैं। यदि आप किसी को विधि को कॉल करने की अनुमति नहीं दे रहे हैं, तो इसे हटाएं क्यों नहीं?
डैन हर्बर्ट

17
@ इस विधि का उपयोग करने से नए कोड को रोकने के लिए । यदि कोई विधि अप्रचलित के रूप में चिह्नित है, तो पुराना कोड बाइनरी संगत रहेगा, लेकिन यदि आप अपवाद छोड़ते हैं तो यह काम करना बंद कर देगा। अगर कोई "ऑब्सोलेट" ध्वज के चारों ओर पाने के लिए प्रतिबिंब का उपयोग कर रहा है, तो आपको इससे भी ज्यादा परेशानी होगी ...
Dan Herbert

204

[Flags]बहुत काम है। सिंथेटिक चीनी सुनिश्चित करने के लिए, लेकिन अभी भी अच्छा है।

[Flags] 
enum SandwichStuff
{
   Cheese = 1,
   Pickles = 2,
   Chips = 4,
   Ham = 8,
   Eggs = 16,
   PeanutButter = 32,
   Jam = 64
};

public Sandwich MakeSandwich(SandwichStuff stuff)
{
   Console.WriteLine(stuff.ToString());
   // ...
}

// ...

MakeSandwich(SandwichStuff.Cheese 
   | SandwichStuff.Ham 
   | SandwichStuff.PeanutButter);
// produces console output: "Cheese, Ham, PeanutButter"

लेप्पी कुछ ऐसी बातों की ओर इशारा करता है जो मुझे महसूस नहीं हुई थीं, और जो इस विशेषता के लिए मेरे उत्साह को कम कर देती हैं: यह संकलक को निर्देश नहीं देती है कि वे बिट कॉम्बिनेशन को वैल्यूएशन वैरिएबल के लिए मान्य मान लें, कंपाइलर इस बात की परवाह किए बिना गणना करता है। मेरे सी ++ पृष्ठभूमि के माध्यम से दिखा ... आह


तो वास्तव में झंडे विशेषता क्या करता है?
आंद्रेई रोनेया

13
मुझे उम्मीद है कि आप लोगों को यह एहसास होगा कि झंडे की विशेषता सभी को चौंका देती है। TypeConverter को छोड़कर इसकी आवश्यकता नहीं है / इसका उपयोग नहीं किया गया है।
लेप्पी

3
@leppie: ToString () भी। लेकिन ... वाह। किसी कारण के लिए, मैं सी ++ के समान होने के लिए एन्यूमरेशंस के व्यवहार की उम्मीद कर रहा था: या मान एक पूर्णांक का उत्पादन करेगा (जैसा कि एनम परम की उम्मीद करने के लिए विधि के रूप में पारित नहीं किया जा सकता है)। मैं देख रहा हूं कि अब ऐसा नहीं है। कमजोर ... ठीक है, .NET enums चूसना।
शोग

2
[झंडे] वास्तव में केवल डिबगर और .TString () फ़ंक्शन को पता है कि एक मान संभावित रूप से एनम में कई घोषणाओं का एक संयोजन है। मुझे यकीन नहीं है, यह Intellisense की मदद कर सकता है आप enum का उपयोग अधिक प्रभावी ढंग से भी कर सकते हैं।
केन्जी १

31
[Flags]सिंटैक्टिक शुगर होने से बड़ा उपयोग है। वेब सेवाओं का उपयोग करते समय, यदि मूल्य जैसा पास किया SandwichStuff.Cheese | SandwichStuff.Ham | SandwichStuff.Jamजाता है , तो क्रमांकन / डी-क्रमांकन काम नहीं करेगा । [Flags]विशेषता के बिना deserializer पता नहीं होगा कि मूल्य झंडे का एक संयोजन हो सकता है। मेरे WCF काम क्यों नहीं कर रहा था, यह सोचने के बारे में दो दिन बिताने के बाद यह कठिन तरीका सीखा।
एंकट

177

मुझे [DebuggerStepThrough]System.Diagnostics से पसंद है

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


5
इसलिए कई बार काश मैं इस संपत्ति के बारे में जानता
wusher

1
बस शर्म की बात है कि इसे बंद कर दिया गया है - अधिक जानकारी के लिए gregbeech.com/blogs/tech/archive/2008/10/17/… देखें ।
ग्रेग बीक

3
किसी भी WM_Paint कोड के लिए भी उपयोगी है जो आप जानते हैं कि काम करता है :)
पॉन्डिडम

@GregBeech वह URL एक .NET त्रुटि देता है। उत्तम दर्जे का! :)
smdrager

@smdrager - एक अस्थायी मुद्दा रहा होगा, आज मेरे लिए काम कर रहा है।
ग्रेग बीच

135

इसके लायक क्या है, यहां सभी .NET विशेषताओं की एक सूची दी गई है । कई सौ हैं।

मैं किसी और के बारे में नहीं जानता, लेकिन मेरे पास कुछ गंभीर RTFM है!


33
पोस्ट की गई सूची .net 1.1 के लिए है। यहां 3.5 msdn.microsoft.com/en-us/library/system.attribute.aspx (आपको थोड़ा नीचे स्क्रॉल करना होगा) की सूची है
kay.one

2
प्रश्न में लिंक अपडेट किया गया। अब यह 3.5 के लिए पूरी सूची है
आर Martinho फर्नांडीस

8
वास्तव में यह नवीनतम के लिए लिंक है, विशेष रूप से 3.5 नहीं।
ब्रायन ओर्टिज़

1
अब यदि केवल सूची केवल लिंक की सूची नहीं थी, लेकिन नाम और विवरण। ओह अच्छा। @BrianOrtiz सही है। सूची 4.5 संस्करण में है।
चमकदार

आप बस उस फ्रेमवर्क को बदलते हैं जिसे आप शीर्ष पर लक्षित कर रहे हैं, जहाँ वह "अन्य संस्करण" कहता है।
नवतपा

129

मेरा वोट किसके लिए होगा Conditional

[Conditional("DEBUG")]
public void DebugOnlyFunction()
{
    // your code here
}

आप उन्नत डिबगिंग सुविधाओं के साथ एक फ़ंक्शन जोड़ने के लिए इसका उपयोग कर सकते हैं; जैसे Debug.Write, इसे केवल डिबग बिल्ड में कहा जाता है, और इसलिए आप अपने प्रोग्राम के मुख्य प्रवाह के बाहर जटिल डिबग लॉजिक को इनकैप्सुलेट कर सकते हैं।


5
यह # डेबग करने के समान नहीं है?
नील एन

10
कुछ हद तक, #if DEBUG का अर्थ है कि कॉल करने वाले को भी कॉल नहीं करना है, जबकि कॉन्डिटियोइनल कॉल को छोड़ देता है, लेकिन यह एक एनओपी बनाता है जो जेआईटी पर समाप्त हो जाता है।
रंगोरिक

23
इसके अलावा, आप आमतौर पर #if DEBUG कॉल के आसपास , और [सशर्त] विधियों के आसपास उपयोग करेंगे । इसलिए यदि आप 100 बार डिबगिंग विधि कहते हैं, तो इसे बंद करना एक एकल कोड परिवर्तन का विषय है, 100 नहीं।
स्टीव कूपर

13
रंगोरिक की टिप्पणी सूक्ष्म रूप से गलत है (कम से कम सी # के लिए): विधि अनमॉडिफाइड शामिल है; कॉल साइट खुद ही छोड़ दी गई है। इसके कुछ निहितार्थ हैं: मापदंडों का मूल्यांकन नहीं किया जाता है, और संकलक के आउटपुट में सशर्त विधि निहित, असंशोधित है। आप इसे प्रतिबिंब के साथ सत्यापित कर सकते हैं। msdn.microsoft.com/en-us/library/aa664622.aspx blogs.msdn.com/b/jmstall/archive/2007/10/15/……
मार्क सोउल

97

मैं हमेशा अपने उपयोगकर्ता नियंत्रणों, कस्टम नियंत्रणों या संपत्ति ग्रिड के माध्यम से संपादित किए जाने वाले किसी भी वर्ग के सार्वजनिक गुणों का उपयोग करता हूं DisplayName, Descriptionऔर DefaultValueविशेषताओं का उपयोग करता हूं। ये टैग .NET PropertyGrid द्वारा नाम, विवरण पैनल, और उन मानों को प्रारूपित करने के लिए उपयोग किए जाते हैं जो डिफ़ॉल्ट मानों पर सेट नहीं होते हैं।

[DisplayName("Error color")]
[Description("The color used on nodes containing errors.")]
[DefaultValue(Color.Red)]
public Color ErrorColor
{
    ...
} 

मेरी इच्छा है कि Visual Studio के IntelliSense Descriptionकोई XML टिप्पणी नहीं मिलने पर विशेषता को ध्यान में रखेगा । यह एक ही वाक्य को दो बार दोहराने से बचना होगा।


3
कैंट का मानना ​​है कि Descriptionजब तक आप किसी पर ध्यान नहीं देते .. तब तक मेरे लिए सबसे ज्यादा उपयोगी है जब वह एनम के साथ इस्तेमाल किया जाता है ..
nawfal

68

[Serializable]बाहरी डेटा स्रोत जैसे xml या किसी दूरस्थ सर्वर से ऑब्जेक्ट को क्रमबद्ध और डिस्क्रिअलाइज़ करने के लिए हर समय उपयोग किया जाता है। इसके बारे में यहाँ और अधिक।


यह वास्तव में एक psuedoattribute को संदर्भित करता है, जैसा कि C # [Serializable] के लिए एक मेटाडाटा ध्वज का उत्सर्जन करता है, एक कस्टम विशेषता उदाहरण नहीं;)
TraumaPony

1
जबकि बहुत उपयोगी [Serializable] एकदम सही है। इसे जिस तरह से आप चाहते हैं परिणाम प्राप्त करने के लिए बहुत अधिक छेड़छाड़ और परीक्षण और त्रुटि की आवश्यकता होती है।
शौहोश

बेनाम: मैं उस shoosh दूसरा होगा!
जॉन Bubriski

यदि आप स्वचालित क्रमांकन पर अधिक नियंत्रण चाहते हैं, तो System.NonSerializedAttribute उपयोगी है।
CSharper

एक साइड नोट के रूप में मैं यह जोड़ना चाहूंगा कि बिल्ट-इन .नेट सीरियलाइजेशन का प्रदर्शन बहुत खराब है, जैसे कि हाथ से बनाए गए कोड की तुलना में 2 या 3 परिमाण धीमे।
Redcalx

57

हॉफस्टेडियन स्पिरिट में, यह [Attribute]विशेषता बहुत उपयोगी है, क्योंकि यह है कि आप अपनी विशेषताओं को कैसे बनाते हैं। मैंने प्लगइन सिस्टम को लागू करने के लिए इंटरफेस के बजाय विशेषताओं का उपयोग किया है, Enums में विवरण जोड़ें, कई प्रेषण और अन्य चाल का अनुकरण करें।


13
अच्छा लग रहा है! क्या आप प्लगइन सिस्टम और एनम विवरण के कुछ उदाहरण दिखाते हैं? वे दोनों चीजें हैं जो मैं खुद को लागू करने में दिलचस्पी रखता हूं!
जॉन Bubriski

46

यहाँ दिलचस्प विशेषता InternalsVanishTo के बारे में पोस्ट है । मूल रूप से यह क्या करता है यह C ++ मित्रों की कार्यक्षमता की नकल करता है। यह यूनिट टेस्टिंग के लिए बहुत काम आता है।


7
क्या आपको किसी ऐसी चीज़ पर यूनिट टेस्ट को हैक करने के लिए काम नहीं करना चाहिए जिसका परीक्षण / परीक्षण नहीं किया जा सकता है?
The_drow

@the_drow: आप 'निजी एक्सेसर्स
habakuk

@ ढाबक: वास्तव में नहीं। ऐसे मामले हैं जहां आंतरिक परीक्षणों को इकाई परीक्षण के लिए उजागर किया जाना चाहिए, आमतौर पर खराब डिजाइन के कारण।
the_drow 15:12 पर

2
@ अन्य आप अपनी परियोजना के बाहर दिखाई नहीं देने वाली छोटी "इकाइयां" बना सकते हैं और उनका परीक्षण कर सकते हैं (यह आपको एक साफ और छोटी एपी बनाने में मदद करता है)। लेकिन अगर आपको यूनिट टेस्ट के लिए 'प्राइवेट एक्सेसर्स' की जरूरत है तो कुछ गलत है।
हबकुक

10
@the_drow मैं आपके उस दावे से असहमत हूं जो internalसार्वजनिक नहीं है। यह असेंबली के भीतर सार्वजनिक है जिसे परीक्षण किया जा रहा है और यूनिट परीक्षण किया जाना चाहिए ताकि विधानसभा के भीतर अन्य वर्ग यह सुधार कार्यक्षमता मान सकें। यदि आप इसका परीक्षण नहीं करते हैं, तो आपको सभी उपभोग वर्गों में इसके कार्यों का परीक्षण करना होगा।
tvanfosson


28

मैं सुझाता हूँ [TestFixture]और [Test]- nnnit लाइब्रेरी से।

आपके कोड में यूनिट परीक्षण रिफैक्टिंग और कोडीफाइड प्रलेखन में सुरक्षा प्रदान करते हैं।


26
[XmlIgnore]

जैसा कि यह आपको (किसी भी xml क्रमांकन में) 'मूल' ऑब्जेक्ट्स को अनदेखा करने की अनुमति देता है जो अन्यथा बचत करते समय अपवादों का कारण होगा।


25

यह अच्छी तरह से नामित नहीं है, फ्रेमवर्क में अच्छी तरह से समर्थित नहीं है, और इसे एक पैरामीटर की आवश्यकता नहीं होनी चाहिए, लेकिन यह विशेषता अचल सेवाओं के लिए एक उपयोगी मार्कर है:

[ImmutableObject(true)]

6
डॉक्स के अनुसार, केवल डिज़ाइन समय (दुर्भाग्य से) पर उपयोग किया जाता है।
हंस के Hans आईएनजी

1
यह देखते हुए कि यह केवल डिज़ाइन-टाइम है, शायद अपना ImmutableObjectAttributeवर्ग बनाना बेहतर होगा - कम से कम आप पैरामीटर को समाप्त कर सकते हैं।
रॉय टिंकर

25

मुझे [ThreadStatic]थ्रेड और स्टैक आधारित प्रोग्रामिंग के संयोजन में विशेषता का उपयोग करना पसंद है । उदाहरण के लिए, यदि मुझे ऐसा मूल्य चाहिए, जिसे मैं शेष कॉल अनुक्रम के साथ साझा करना चाहता हूं, लेकिन मैं इसे बैंड से बाहर करना चाहता हूं (अर्थात कॉल पैरामीटर के बाहर), मैं इस तरह से कुछ काम कर सकता हूं।

class MyContextInformation : IDisposable {
    [ThreadStatic] private static MyContextInformation current;

    public static MyContextInformation Current {
        get { return current; }
    }

    private MyContextInformation previous;


    public MyContextInformation(Object myData) {
       this.myData = myData;
       previous = current;
       current = this;
    }

    public void Dispose() {
       current = previous;
    }
}

बाद में अपने कोड में, मैं इसका उपयोग अपने कोड से डाउनस्ट्रीम लोगों को बैंड से बाहर प्रासंगिक जानकारी प्रदान करने के लिए कर सकता हूं। उदाहरण:

using(new MyContextInformation(someInfoInContext)) {
   ...
}

थ्रेडस्टैटिक विशेषता मुझे थ्रेड में डेटा पहुंच की गड़बड़ समस्या से बचने के लिए केवल कॉल को थ्रेड में स्कोप करने की अनुमति देती है।


और फिर कैसे पहुंचें? यहां अपने उपयोग के नमूने के बिंदु को न समझें। क्या तुम समझा सकते हो?
समुद्र तट

@Beachwalker करंट को स्थिर होना चाहिए, इसे अभी संपादित किया जाना चाहिए। अब आप MyContextInformation.Currentस्टैक पर सक्रिय संदर्भ प्राप्त करने के लिए उपयोग कर सकते हैं । यह कुछ ऐसा है जो कुछ मामलों में बहुत अच्छी अवधारणा है, हमारे (मेरी कंपनी) इंजन बहुत सारे उद्देश्यों के लिए इसका उपयोग करते हैं।
फेलिक्स के।

23

DebuggerHiddenAttribute जो कोड में कदम जो डिबग नहीं किया जाना चाहिए से बचने के लिए अनुमति देता है।

public static class CustomDebug
{
    [DebuggerHidden]
    public static void Assert(Boolean condition, Func<Exception> exceptionCreator) { ... }
}

...

// The following assert fails, and because of the attribute the exception is shown at this line
// Isn't affecting the stack trace
CustomDebug.Assert(false, () => new Exception()); 

इसके अलावा यह स्टैक ट्रेस में विधियों को दिखाने से रोकता है, उपयोगी होने पर एक विधि जो सिर्फ एक अन्य विधि को लपेटता है:

[DebuggerHidden]
public Element GetElementAt(Vector2 position)
{
    return GetElementAt(position.X, position.Y);
}

public Element GetElementAt(Single x, Single y) { ... }

यदि आप अब कॉल करते हैं GetElementAt(new Vector2(10, 10))और लिपटे हुए विधि में कोई त्रुटि होती है, तो कॉल स्टैक वह विधि नहीं दिखा रहा है जो उस पद्धति को कॉल कर रही है जो त्रुटि को फेंकता है।


21

DesignerSerializationVisibilityAttributeबहुत उपयोगी है। जब आप एक रनटाइम प्रॉपर्टी को एक कंट्रोल या कंपोनेंट पर रखते हैं, और आप नहीं चाहते कि डिजाइनर इसे सीरीज़ करें, तो आप इसे इस तरह से इस्तेमाल करते हैं:

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public Foo Bar {
    get { return baz; }
    set { baz = value; }
}

4
WinForms घटकों के लिए बहुत उपयोगी है। [ब्राउज़ करने योग्य (झूठे)] के साथ संयोजन में उपयोग करें
मार्क हीथ

3
अच्छा बिंदु - [Browsable(false)]इसे डिजाइनर के उपयोगकर्ता से छिपाने के लिए आवश्यक है, जहां [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]आवश्यक है, इसलिए इसे क्रमबद्ध नहीं किया जाएगा।
विन्यासकर्ता

17

केवल कुछ विशेषताओं को कंपाइलर समर्थन मिलता है, लेकिन विशेषताओं का एक बहुत ही रोचक उपयोग AOP में है: PostSharp IL को विधियों में इंजेक्ट करने के लिए आपके bespoke विशेषताओं का उपयोग करता है, सभी प्रकार की क्षमताओं की अनुमति देता है ... लॉग / ट्रेस तुच्छ उदाहरण हैं - लेकिन कुछ अन्य अच्छे उदाहरण स्वचालित INotifyPropertyChanged कार्यान्वयन ( यहां ) जैसी चीजें हैं ।

कुछ जो संकलक या रनटाइम को सीधे प्रभावित करते हैं :

  • [Conditional("FOO")] - इस विधि के लिए कॉल (तर्क मूल्यांकन सहित) केवल तब होता है जब निर्माण के दौरान "FOO" प्रतीक को परिभाषित किया जाता है
  • [MethodImpl(...)] - सिंक्रनाइज़ेशन, इनलाइनिंग जैसी कुछ चीज़ों को इंगित करने के लिए उपयोग किया जाता है
  • [PrincipalPermission(...)] - कोड में सुरक्षा जांच को स्वचालित रूप से इंजेक्ट करने के लिए उपयोग किया जाता है
  • [TypeForwardedTo(...)]- कॉल के पुनर्निर्माण के बिना विधानसभाओं के बीच प्रकारों को स्थानांतरित करने के लिए उपयोग किया जाता है

प्रतिबिंब के माध्यम से मैन्युअल रूप से जांच की जाने वाली चीजों के लिए - मैं System.ComponentModelविशेषताओं का एक बड़ा प्रशंसक हूं ; चीजों की तरह [TypeDescriptionProvider(...)], [TypeConverter(...)]और [Editor(...)]जो डेटा-बाइंडिंग परिदृश्यों (यानी गतिशील गुण आदि) में प्रकारों के व्यवहार को पूरी तरह से बदल सकते हैं।


15

अगर मुझे एक कोड कवरेज क्रॉल करना था, तो मुझे लगता है कि ये दोनों शीर्ष होंगे:

 [Serializable]
 [WebMethod]

15
[WebMethod] का उपयोग एक विधि को सजाने के लिए किया जाता है जिसे वेब सेवा में उजागर किया जाता है। [सीरियल बनाने योग्य] आपकी वस्तुओं को ऐसे चिह्नित करता है कि उन्हें ऐप्प डोमेन पर पार करने जैसे उद्देश्यों के लिए क्रमबद्ध किया जा सकता है।
केव

15

मैं [DataObjectMethod]हाल ही में उपयोग कर रहा हूँ । यह विधि का वर्णन करता है ताकि आप ObjectDataSource (या अन्य नियंत्रण) के साथ अपनी कक्षा का उपयोग कर सकें।

[DataObjectMethod(DataObjectMethodType.Select)] 
[DataObjectMethod(DataObjectMethodType.Delete)] 
[DataObjectMethod(DataObjectMethodType.Update)] 
[DataObjectMethod(DataObjectMethodType.Insert)] 

और जानकारी


12

हमारी वर्तमान परियोजना में, हम उपयोग करते हैं

[ComVisible(false)]

यह COM प्रबंधित व्यक्ति या असेंबली या असेंबली के सभी प्रकारों की पहुंच को COM तक नियंत्रित करता है।

और जानकारी


12
[TypeConverter(typeof(ExpandableObjectConverter))]

डिज़ाइनर को उन गुणों का विस्तार करने के लिए कहता है जो वर्ग हैं (आपके नियंत्रण के)

[Obfuscation]

असेंबली, प्रकार, या सदस्य के लिए निर्दिष्ट कार्यों को लेने के लिए ऑब्सफैक्शन टूल को निर्देश देता है। (हालांकि आमतौर पर आप असेंबली स्तर का उपयोग करते हैं[assembly:ObfuscateAssemblyAttribute(true)]


1
मैंने अनुमान लगाया, लेकिन गलत था। Obfuscation विशेषता केवल 3 पार्टी पर्यवेक्षकों के लिए एक संकेत है। यह संकलक को डिफ़ॉल्ट रूप से कुछ भी बाधित करने का कारण नहीं बनता है।
दान

दृश्य स्टूडियो प्रो / अंतिम उपयोगकर्ताओं के लिए @DanNeely मुफ्त!
क्रिस एस

4
यदि आप DotFuscator कम्युनिटी एडिशन की बात कर रहे हैं, तो सुरक्षा का स्तर इतना कम है कि सबसे अच्छा यह मुश्किल से कुछ भी गिना जाता है।
दान

@ricovox मैंने
क्रिस एस

9

मैं जिन विशेषताओं का सबसे अधिक उपयोग करता हूं, वे XML सीरियललाइज़ेशन से संबंधित हैं।

XmlRoot

XmlElement

XmlAttribute

आदि...

किसी भी त्वरित और गंदे XML पार्सिंग या धारावाहिक करते समय अत्यधिक उपयोगी।


8

एक मध्यम स्तरीय डेवलपर होने के नाते मुझे पसंद है

System.ComponentModel.EditorBrowsableAttribute मुझे संपत्तियों को छिपाने की अनुमति देता है ताकि UI डेवलपर उन गुणों से अभिभूत न हो, जिन्हें उन्हें देखने की आवश्यकता नहीं है।

System.ComponentModel.BindableAttributeकुछ चीजों के लिए डेटाबाउंड होना जरूरी नहीं है। फिर से, यूआई डेवलपर्स को जो काम करने की आवश्यकता है उसे कम करता है।

मुझे यह भी पसंद है DefaultValueकि लॉरेंस जॉनसन ने उल्लेख किया है।

System.ComponentModel.BrowsableAttributeऔर Flagsनियमित रूप से उपयोग किया जाता है।

System.STAThreadAttribute System.ThreadStaticAttribute जरूरत पड़ने पर इस्तेमाल करता हूं ।

वैसे। मैं ये सभी .Net फ्रेमवर्क डेवलपर्स के लिए मूल्यवान हैं।


8

[EditorBrowsable(EditorBrowsableState.Never)]यदि आप प्रोजेक्ट आपके समाधान में नहीं हैं, तो आपको IntelliSense से गुण और विधियों को छिपाने की अनुमति देता है। धाराप्रवाह इंटरफेस के लिए अवैध प्रवाह को छिपाने के लिए बहुत उपयोगी है। आप कितनी बार GetHashCode () या Equals () करना चाहते हैं?

MVC के लिए [ActionName("Name")]आपको एक ही विधि हस्ताक्षर के साथ कार्रवाई करने और पोस्ट कार्रवाई करने या कार्रवाई के नाम में डैश का उपयोग करने की अनुमति देता है, जो अन्यथा इसके लिए एक मार्ग बनाए बिना संभव नहीं होगा।


8

मुझे लगता है कि यहाँ उल्लेख करना महत्वपूर्ण है कि निम्नलिखित विशेषताएं भी बहुत महत्वपूर्ण हैं:

STAThreadAttribute 

इंगित करता है कि COM थ्रेडिंग मॉडल एक आवेदन के लिए सिंगल-थ्रेडेड अपार्टमेंट (STA) है।

उदाहरण के लिए इस विशेषता का उपयोग विंडोज फॉर्म एप्लीकेशन में किया जाता है:

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }
}

और भी ...

SuppressMessageAttribute

एक विशिष्ट स्थिर विश्लेषण उपकरण नियम के उल्लंघन की रिपोर्टिंग का समर्थन करता है, जिससे एक ही कोड विरूपण साक्ष्य पर कई दमन किए जा सकते हैं।

उदाहरण के लिए:

[SuppressMessage("Microsoft.Performance", "CA1801:ReviewUnusedParameters", MessageId = "isChecked")]
[SuppressMessage("Microsoft.Performance", "CA1804:RemoveUnusedLocals", MessageId = "fileIdentifier")]
static void FileNode(string name, bool isChecked)
{
    string fileIdentifier = name;
    string fileName = name;
    string version = String.Empty;
}

क्या STAThread का उपयोग आपके एप्लिकेशन को गलती से स्टार्ट अप पर स्वयं के किसी अन्य उदाहरण को बंद करने से रोकने के लिए किया जाता है?
चमकदार

7

मेरे सिर के ऊपर, यहाँ एक त्वरित सूची है, मोटे तौर पर उपयोग की आवृत्ति द्वारा क्रमबद्ध, पूर्वनिर्धारित विशेषताओं का मैं वास्तव में एक बड़ी परियोजना में उपयोग करता हूं (~ 500k एलओसी):

झंडे, सीरियल बनाने योग्य, WebMethod, COMV अदृश्य, TypeConverter, सशर्त, थ्रेडस्टैटिक, अप्रचलित, आंतरिक, अदृश्य, DebuggerStepThrough।


2
थ्रेडस्टैटिक के लिए +1, किसी ने भी अब तक इसका उल्लेख नहीं किया है, और सांख्यिकीय दृष्टिकोण के लिए भी
स्टैफ्ल सिप

6

मैं कोडस्मिथ के माध्यम से डेटा इकाई वर्ग उत्पन्न करता हूं और मैं कुछ सत्यापन दिनचर्या के लिए विशेषताओं का उपयोग करता हूं। यहाँ एक उदाहरण है:

/// <summary>
/// Firm ID
/// </summary>
[ChineseDescription("送样单位编号")]
[ValidRequired()]
public string FirmGUID
{
    get { return _firmGUID; }
    set { _firmGUID = value; }
}

और डेटा यूनिट वर्ग से जुड़ी विशेषताओं के आधार पर सत्यापन करने के लिए मुझे एक उपयोगिता वर्ग मिला। यहाँ कोड है:

namespace Reform.Water.Business.Common
{
/// <summary>
/// Validation Utility
/// </summary>
public static class ValidationUtility
{
    /// <summary>
    /// Data entity validation
    /// </summary>
    /// <param name="data">Data entity object</param>
    /// <returns>return true if the object is valid, otherwise return false</returns>
    public static bool Validate(object data)
    {
        bool result = true;
        PropertyInfo[] properties = data.GetType().GetProperties();
        foreach (PropertyInfo p in properties)
        {
            //Length validatioin
            Attribute attribute = Attribute.GetCustomAttribute(p,typeof(ValidLengthAttribute), false);
            if (attribute != null)
            {
                ValidLengthAttribute validLengthAttribute = attribute as ValidLengthAttribute;
                if (validLengthAttribute != null)
                {
                    int maxLength = validLengthAttribute.MaxLength;
                    int minLength = validLengthAttribute.MinLength;
                    string stringValue = p.GetValue(data, null).ToString();
                    if (stringValue.Length < minLength || stringValue.Length > maxLength)
                    {
                        return false;
                    }
                }
            }
            //Range validation
            attribute = Attribute.GetCustomAttribute(p,typeof(ValidRangeAttribute), false);
            if (attribute != null)
            {
                ValidRangeAttribute validRangeAttribute = attribute as ValidRangeAttribute;
                if (validRangeAttribute != null)
                {
                    decimal maxValue = decimal.MaxValue;
                    decimal minValue = decimal.MinValue;
                    decimal.TryParse(validRangeAttribute.MaxValueString, out maxValue);
                    decimal.TryParse(validRangeAttribute.MinValueString, out minValue);
                    decimal decimalValue = 0;
                    decimal.TryParse(p.GetValue(data, null).ToString(), out decimalValue);
                    if (decimalValue < minValue || decimalValue > maxValue)
                    {
                        return false;
                    }
                }
            }
            //Regex validation
            attribute = Attribute.GetCustomAttribute(p,typeof(ValidRegExAttribute), false);
            if (attribute != null)
            {
                ValidRegExAttribute validRegExAttribute = attribute as ValidRegExAttribute;
                if (validRegExAttribute != null)
                {
                    string objectStringValue = p.GetValue(data, null).ToString();
                    string regExString = validRegExAttribute.RegExString;
                    Regex regEx = new Regex(regExString);
                    if (regEx.Match(objectStringValue) == null)
                    {
                        return false;
                    }
                }
            }
            //Required field validation
            attribute = Attribute.GetCustomAttribute(p,typeof(ValidRequiredAttribute), false);
            if (attribute != null)
            {
                ValidRequiredAttribute validRequiredAttribute = attribute as ValidRequiredAttribute;
                if (validRequiredAttribute != null)
                {
                    object requiredPropertyValue = p.GetValue(data, null);
                    if (requiredPropertyValue == null || string.IsNullOrEmpty(requiredPropertyValue.ToString()))
                    {
                        return false;
                    }
                }
            }
        }
        return result;
    }
}
}


5

[System.Security.Permissions.PermissionSetAttribute] घोषित सुरक्षा का उपयोग करके कोड के लिए एक PermissionSet के लिए सुरक्षा क्रियाओं को लागू करने की अनुमति देता है।

// usage:
public class FullConditionUITypeEditor : UITypeEditor
{
    // The immediate caller is required to have been granted the FullTrust permission.
    [PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust")]
    public FullConditionUITypeEditor() { }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.