दिलचस्प पोस्ट
जावास्क्रिप्ट के लिए एक दशमलव गणित पुस्तकालय है? एंड्रॉइड लॉलीपॉप टूलबार: स्क्रॉल करते समय उपकरण पट्टी को छुपाने / दिखाने के लिए कैसे? अभिव्यक्ति बनाम विवरण सिर्फ एक मेसेफाइल का उपयोग करके उप-निर्देशिका में स्रोत के साथ मेकफाइल कैसे उत्पन्न करें किसी अन्य एप्लिकेशन के लिए एक कुंजी भेजने के लिए Sendkey फ़ंक्शन का उपयोग करके C # एंड्रॉइड ग्रेडल प्लगइन 0.7.3 का उपयोग करके प्रोजेक्ट में प्री-बिल्ट .so फाइलें जोड़ें हमें सस्ती वेब सेवाओं की आवश्यकता क्यों है? डाटाबेस में पदानुक्रमित डेटा संरचना को कार्यान्वित करना AngularJS का नियंत्रण दो बार नियंत्रक का मुकाबला करना क्या ब्राउज़रों 'एफ 5' और 'Ctrl + F5' रिफ्रेश उत्पन्न करते हैं? सीपीयू वास्तुकला संकलन-समय का पता लगा रहा है सी # स्ट्रिंग का GetHashCode () कैसे कार्यान्वित किया जाता है? डाउनलोड करने के लिए PHP उत्पन्न फ़ाइल तब पुनर्निर्देशित करें उद्देश्य-सी घोषित @ प्रॉपर्टी गुण (गैर-रचनात्मक, कॉपी, मजबूत, कमजोर) यह जांच कैसे करें कि क्या एक खिड़कियां प्रपत्र पहले से ही खुला है, और अगर यह है तो इसे बंद करें?

कस्टम कंपाइलर चेतावनी

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

[MyAttribute("This code sux and should be looked at")] public sub DoEverything(){} 

मैं चाहता हूं कि यह एक कंपाइलर चेतावनी उत्पन्न करे जो कहते हैं, "यह कोड सुक्स और देखा जाना चाहिए" मुझे पता है कि कस्टम विशेषता कैसे बनाएं, सवाल यह है कि मैं इसे विज़ुअल स्टूडियो में कम्पाइलर चेतावनी कैसे उत्पन्न कर सकता हूं।

Solutions Collecting From Web of "कस्टम कंपाइलर चेतावनी"

अद्यतन करें

अब Roslyn (विजुअल स्टूडियो 2015) के साथ यह संभव है कस्टम ऐट्रिब्यूट के लिए जांच करने के लिए आप एक कोड विश्लेषक बना सकते हैं


मुझे विश्वास नहीं है कि यह संभव है। अप्रचलित विशेषता को संकलक द्वारा विशेष रूप से व्यवहार किया जाता है और सी # मानक में परिभाषित किया जाता है। क्यों पृथ्वी अप्रचलित गुण स्वीकार्य नहीं है? मुझे ऐसा लगता है कि यह ठीक यही स्थिति है जिसके लिए इसे तैयार किया गया था, और ठीक से प्राप्त करने के लिए आपको क्या चाहिए!

यह भी ध्यान रखें कि विज़ुअल स्टूडियो उड़ने पर अप्रचलित एट्रिब्यूट द्वारा उत्पन्न चेतावनियों को भी उठाता है, जो बहुत उपयोगी है।

बेकार होने का मतलब नहीं है, बस सोच रहा है कि आप इसका उपयोग करने के लिए उत्सुक क्यों नहीं हैं …

दुर्भाग्य से अप्रचलित ऐटिबिल सील हो चुका है (संभवत: विशेष इलाज के कारण आंशिक रूप से) इसलिए आप इससे अपनी खुद की विशेषता को नहीं छोड़ सकते

सी # मानक से: –

विशेषता अप्रचलित प्रकार और उन प्रकार के सदस्यों को चिह्नित करने के लिए उपयोग किया जाता है जिन्हें अब उपयोग नहीं किया जाना चाहिए।

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

क्या यह आपकी ज़रूरतों को पूरा नहीं करता? … आप उससे बेहतर नहीं करने जा रहे हैं जो मुझे नहीं लगता।

नहीं पता कि यह काम करेगा, लेकिन यह एक कोशिश के लायक है

आप अप्रचलित नहीं बढ़ा सकते हैं, क्योंकि इसकी अंतिम, लेकिन शायद आप अपना स्वयं का गुण बना सकते हैं, और इस वर्ग को अप्रचलित तरह चिह्नित कर सकते हैं:

 [Obsolete("Should be refactored")] public class MustRefactor: System.Attribute{} 

तब जब आप "MustRefactor" विशेषता के साथ अपने तरीकों को चिह्नित करते हैं, तो संकलित चेतावनी दिखा सकती है।

मैंने कहा "शायद" और "शायद" क्योंकि मैंने यह कोशिश नहीं की है कृपया मुझे बताओ कि क्या यह काम नहीं करता है तो मैं जवाब निकाल दूंगा।

सादर!

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

UPDATE2: इस कोड के साथ यह चेतावनी उत्पन्न करता है (बहुत अच्छा नहीं है, लेकिन मुझे नहीं लगता कि कुछ बेहतर है)।

 public class User { private String userName; [TooManyArgs] // Will show warning: Try removing some arguments public User(String userName) { this.userName = userName; } public String UserName { get { return userName; } } [MustRefactor] // will show warning: Refactor is needed Here public override string ToString() { return "User: " + userName; } } [Obsolete("Refactor is needed Here")] public class MustRefactor : System.Attribute { } [Obsolete("Try removing some arguments")] public class TooManyArgs : System.Attribute { } 

कुछ कंपलर में आप # चेतावनी जारी करने के लिए चेतावनी का उपयोग कर सकते हैं:

 #warning "Do not use ABC, which is deprecated. Use XYZ instead." 

माइक्रोसॉफ्ट कंपाइलर्स में, आप आमतौर पर संदेश प्रोग्राम का उपयोग कर सकते हैं:

 #pragma message ( "text" ) 

आपने नेट का उल्लेख किया है, लेकिन यह निर्दिष्ट नहीं किया है कि आप सी / सी ++ या सी # के साथ प्रोग्रामिंग कर रहे थे। यदि आप सी # में प्रोग्रामिंग कर रहे हैं, तो आपको यह जानना चाहिए कि सी # # चेतावनी प्रारूप का समर्थन करता है

हम वर्तमान में बहुत से रिफैक्टरिंग के बीच में हैं जहां हम सब कुछ ठीक नहीं कर सके। हम सिर्फ # चेतावनी preproc आदेश का उपयोग करते हैं जहां हमें वापस जाने और कोड को देखने की आवश्यकता है। यह संकलक आउटपुट में दिखाई देता है। मुझे नहीं लगता कि आप इसे किसी विधि पर रख सकते हैं, लेकिन आप इसे विधि के अंदर ही रख सकते हैं, और यह अभी भी खोजने में आसान है।

 public void DoEverything() { #warning "This code sucks" } 

वीएस 2008 (+ एसपी 1) में क्लीन सोलन एंड रिब्यूनल सॉल्यूशन के बाद त्रुटि सूची में ठीक से नहीं दिखाया गया है, ये सभी नहीं हैं कुछ चेतावनियों को केवल त्रुटि सूची में दिखाया गया है जब मैं विशिष्ट वर्ग फ़ाइल खोलता हूं। इसलिए मुझे कस्टम विशेषता का उपयोग करने के लिए मजबूर किया गया था:

 [Obsolete("Mapping ToDo")] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property)] public class MappingToDo : System.Attribute { public string Comment = ""; public MappingToDo(string comment) { Comment = comment; } public MappingToDo() {} } 

इसलिए जब मैं इसके साथ कुछ कोड को ध्वज करता हूँ

 [MappingToDo("Some comment")] public class MembershipHour : Entity { // ..... } 

इससे चेतावनी उत्पन्न होती है:

नामस्थान। मैपिंग टूडो अप्रचलित है: 'मैपिंग टू टू'

मैं चेतावनी का पाठ नहीं बदल सकता, 'कुछ टिप्पणी' यह नहीं दिखाया त्रुटि सूची। लेकिन यह फ़ाइल में उचित जगह पर कूद जाएगा। इसलिए यदि आपको इस तरह के चेतावनी संदेशों को बदलना है, तो विभिन्न विशेषताओं बनाएं।

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

 //TODO: This code sux and should be looked at public class SuckyClass(){ //TODO: Do something really sucky here! } 

फिर मेनू से ओपन व्यू / टास्क सूची। कार्य सूची में दो श्रेणियां, उपयोगकर्ता कार्य और टिप्पणियां हैं। टिप्पणियाँ पर स्विच करें और आप अपने सभी टोडो देखेंगे: 's वहाँ TODO पर डबल क्लिक करना आपके कोड में टिप्पणी पर कूद जाएगा।

अल

मुझे नहीं लगता कि आप कर सकते हैं जहाँ तक मुझे पता है कि अप्रचलित एट्रिब्यूट के लिए समर्थन सी # संकलक में अनिवार्य रूप से कठिन है; आप सीधे कुछ समान नहीं कर सकते

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

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

ऐसी कई टिप्पणियां हैं जो चेतावनी या प्रोगाम को सम्मिलित करने का सुझाव देती हैं। अप्रचलित एक बहुत अलग तरीके से काम करता है! पुस्तकालय एल के एक अप्रचलित समारोह को चिह्नित करते हुए, अप्रचलित संदेश तब उठाता है जब कोई प्रोग्राम फ़ंक्शन कॉल करता है, भले ही कॉलर प्रोग्राम लाइब्रेरी एल में न हो। चेतावनी केवल जब एल संकलित की जाती है, संदेश को उठाता है।

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

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

 [AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = true)] public class IDEMessageAttribute : Attribute { public string Message; public IDEMessageAttribute(string message); } 

ऐसा करने के लिए आपको पहले रॉसलीन एसडीके स्थापित करने और विश्लेषक के साथ एक नया वीएसआईएक्स प्रोजेक्ट शुरू करना होगा, मैंने आपके ऐसे विश्लेषकों में से कुछ कम प्रासंगिक टुकड़े को छोड़ दिया है, जैसे कि संदेश आप यह कैसे कर सकते हैं, अपने विश्लेषक में

 public override void Initialize(AnalysisContext context) { context.RegisterSyntaxNodeAction(AnalyzerInvocation, SyntaxKind.InvocationExpression); } private static void AnalyzerInvocation(SyntaxNodeAnalysisContext context) { var invocation = (InvocationExpressionSyntax)context.Node; var methodDeclaration = (context.SemanticModel.GetSymbolInfo(invocation, context.CancellationToken).Symbol as IMethodSymbol); //There are several reason why this may be null eg invoking a delegate if (null == methodDeclaration) { return; } var methodAttributes = methodDeclaration.GetAttributes(); var attributeData = methodAttributes.FirstOrDefault(attr => IsIDEMessageAttribute(context.SemanticModel, attr, typeof(IDEMessageAttribute))); if(null == attributeData) { return; } var message = GetMessage(attributeData); var diagnostic = Diagnostic.Create(Rule, invocation.GetLocation(), methodDeclaration.Name, message); context.ReportDiagnostic(diagnostic); } static bool IsIDEMessageAttribute(SemanticModel semanticModel, AttributeData attribute, Type desiredAttributeType) { var desiredTypeNamedSymbol = semanticModel.Compilation.GetTypeByMetadataName(desiredAttributeType.FullName); var result = attribute.AttributeClass.Equals(desiredTypeNamedSymbol); return result; } static string GetMessage(AttributeData attribute) { if (attribute.ConstructorArguments.Length < 1) { return "This method is obsolete"; } return (attribute.ConstructorArguments[0].Value as string); } 

इसके लिए कोई CodeFixProvider नहीं हैं, आप इसे समाधान से निकाल सकते हैं।