2015-06-16 6 views
9

के भीतर एक विशिष्ट संकेत कैसे दिखाएं मैं वर्तमान में अपने कोडिंग सनसनी में सुधार करने के लिए काम कर रहा हूं इसलिए मैंने उपयोग किए जा रहे प्रकारों में कुछ एक्सटेंशन विधियां जोड़ना शुरू कर दिया है।विजुअल स्टूडियो


मुझे पता चला कि मैं हमेशा एक ही विशेषताओं के साथ एक ही कार्रवाई कर रहा हूं।

मैं जब किसी ReplaceNewLine("|") कॉल इस संकेत दिखाना चाहते हैं:

चार आप निकालना चाहते हैं | है। इसके बजाय RemoveNewLine() एक्सटेंशन का उपयोग बिना किसी विशेषताओं के करें।

मैंने इसे [Obsolete(...)] विशेषता के साथ करने की कोशिश की, लेकिन जब भी मैंने फ़ंक्शन को बुलाया तो यह दिखाया गया।

मेरा प्रश्न है: मैं विजुअल स्टूडियो के भीतर अपने इनपुट के आधार पर एक विशिष्ट संकेत कैसे दिखा सकता हूं?

कोड:

public static class StringExtension 
{ 
    public static string ReplaceNewLine(this string s) 
    { 
     return s.Replace("|", Environment.NewLine); 
    } 

    // show hint if c is | 
    public static string ReplaceNewLine(this string s, string c) 
    { 
     return s.Replace(c, Environment.NewLine); 
    } 
} 

समानाधिकरण:

  • बेशक संकेत Obsolete कोड (0618/CS0618) जब यह दिखाया गया है हो सकता है, लेकिन यह मेरे लिए महत्वपूर्ण नहीं है । मैं सिर्फ संकेत दिखाता हूं!
  • मैं C# 6.0, .NET 4.6 और Visual Studio 2015 RC के साथ काम कर रहा हूं।
+0

एक ReSharper प्लगइन एक समाधान हो सकता है? –

+0

@ थॉमस नहीं, मुझे खेद है, लेकिन एक रीशेपर प्लगइन मेरे लिए उपयुक्त समाधान नहीं होगा, क्योंकि मैं इसका उपयोग नहीं करता हूं। इसे किसी भी अतिरिक्त प्रोग्राम को जोड़ने/इंस्टॉल किए बिना विजुअल स्टूडियो में कोड के साथ पूरी तरह से किया जाना चाहिए। लेकिन वैसे भी धन्यवाद ... – cramopy

+0

क्या आपने लगभग 2 निजी तरीकों से एक रैपर विधि का उपयोग करने की कोशिश की है, जो अप्रचलित है, लेकिन इनपुट केवल "|" कहलाता है? – Eris

उत्तर

3

विजुअल स्टूडियो 2015 में रोज़लिन डायग्नोस्टिक (और वैकल्पिक फिक्स) का उपयोग करना संभव है। नया विजुअल स्टूडियो 2015 कोड एडिटर रोज़लिन को कोड एनालिसिस, मेट्रिक्स और रिफैक्टरिंग इंजन को पार्स करने के लिए हुड के तहत उपयोग करता है, जो अब इस पर आधारित है।

ऐसे निरीक्षण का नमूना कार्यान्वयन given on the Roslyn github page है। स्टैक ओवरफ्लो पर यहां एक उत्तर के लिए एक पूर्ण कार्यान्वयन थोड़ा अधिक होगा, क्योंकि इसमें पूर्ण ट्यूटोरियल के माध्यम से जाने के लिए कई कदम हैं और something similar is given here का यह पूरा ट्यूटोरियल है। और आपके काम का आधार हो सकता है। (बाद में अतिरिक्त प्रश्न पूछें)। standard rules that ship with the product can be found in the Roslyn GitHub as well के लिए कोड।

कोड का यह टुकड़ा आपको बहुत करीब ले जाना चाहिए, लेकिन मैंने इसका परीक्षण नहीं किया है। रोसलिन एसडीके totorial के अनुसार एक मानक नैदानिक ​​& ठीक बनाएँ और की जगह के साथ Initialize और AnalyzeNode तरीके (अपने स्वयं के साथ नाम स्थान डालें):

public override void Initialize(AnalysisContext context) 
{ 
    context.RegisterSyntaxNodeAction(AnalyzeSyntaxNode, SyntaxKind.InvocationExpression); 
} 

private void AnalyzeSyntaxNode(SyntaxNodeAnalysisContext context) 
{ 
    InvocationExpressionSyntax invocationExpression = context.Node as InvocationExpressionSyntax; 
    IMethodSymbol methodSymbol = context.SemanticModel.GetSymbolInfo(invocationExpression).Symbol as IMethodSymbol; 

    if (
     methodSymbol != null 
     && methodSymbol.Name == "ReplaceNewline" 
     && methodSymbol.ContainingNamespace.Name == "MySampleFix" 
     && methodSymbol.OriginalDefinition.Parameters.Length == 1) 
    { 
     if (invocationExpression.ArgumentList.Arguments.Count() == 1) 
     { 
      LiteralExpressionSyntax arg = 
       invocationExpression.ArgumentList.Arguments[0].Expression as LiteralExpressionSyntax; 

      if (arg != null && arg.Token.ValueText == "|") 
      { 
       Diagnostic.Create(Rule, invocationExpression.GetLocation()); 
      } 
     } 
    } 
} 

आप कुछ दृश्य के पुराने संस्करणों के साथ पीछे की ओर संगत है बनाना चाहते हैं स्टूडियो आप कस्टम कोड विश्लेषण नियम लिखने का विकल्प चुन सकते हैं। यह example ruleRegex.Match और Regex.Replace पर एक कॉल में इनपुट लेता है और संकलित नहीं होने पर चेतावनी देता है। चेतावनी देने के लिए यह एक आसान स्ट्रिंग होने पर भी आसान होगा।

रिशेर्पर और कोडरश जैसे विजुअल स्टूडियो एक्सटेंशन एक एसडीके प्रदान करते हैं जो FxCop के समान चीजें कर सकता है, लेकिन वे Roslyn जैसे आईडीई में एम्बेड करते हैं। यह दृष्टिकोण आपके लिए एक विकल्प हो सकता है।

यदि आप कोड संपादक में कुछ चाहते हैं जो किसी भी एक्सटेंशन या अनुकूलन का उपयोग नहीं करता है, तो कोडेडोक में <remark /> जोड़ना जितना हो सके उतना है। सबसे बुरे मामले में आप विधि में Debug.Assert(input != "|"); डाल सकते हैं, इस तरह डेवलपर्स को प्रारंभिक चेतावनी (विकास/डीबग समय पर) मिल जाएगी कि वे आपके एपीआई का गलत इस्तेमाल कर रहे हैं।

+0

यदि आप परीक्षा भी प्रदान कर सकते हैं, तो जवाब सही होगा! – cramopy

+0

मैं रोज़लिन नियमों का राजा नहीं हूं (अभी तक) और प्रदान किया गया नमूना सबसे अच्छा उपलब्ध नहीं हो सकता है। इसे शुरू करने और बाद के प्रश्न पूछने के लिए आपको पर्याप्त देना चाहिए। उदाहरण के लिए – jessehouwing

+0

धन्यवाद !! : डी – cramopy

-3

उपयोग एकल उद्धरण

return s.Replace('|', Environment.NewLine); 
+1

आपने पूरी तरह से इस सवाल को गलत समझा। – slugster

+0

क्या आपने प्रश्न भी पढ़ा ?? – cramopy

1

मुझे लगता है कि यह संभव है न, केवल

जोरदार टिप्पणी के अपवाद के

:)

/// <summary> 
/// Replace specific char with <see cref="Environment.NewLine"/> 
/// </summary> 
/// <param name="s">input</param> 
/// <param name="c">If the char is "|", use the extension method without any parameter instead (<see cref="StringExtension.ReplaceNewLine()" />).</param> 
/// <returns>something with maybe new lines.</returns> 
public static string ReplaceNewLine(this string s, string c) {...} 

मैं नहीं जानता के साथ शुद्ध विजुअल स्टूडियो में संकेत उत्पन्न करने का कोई अन्य तरीका, वाई #warning msg (और #pragma) का अपवाद, लेकिन वे केवल पूर्व परिभाषित बिल्ड पैरामीटर (जैसे #IF DEBUG आदि) द्वारा सशर्त हैं और वे सीधे त्रुटि सूची में जाते हैं।

Btw सिर्फ मनोरंजन के लिए

&: यदि आप डिफ़ॉल्ट मान जोड़कर अपने उदाहरण हल कर सकते हैं

public static class StringExtension 
{ 
    public static string ReplaceNewLine(this string s, string c = "|") 
    { 
     return s.Replace(c, Environment.NewLine); 
    } 
} 

संपादित करें:jessehouwing जवाब काफी बेहतर है, इस पूरे जवाब था और अधिक या कम एक मजाक के बारे में जोरदार टिप्पणी :)

+2

"डिफ़ॉल्ट" से सावधान रहें क्योंकि वे काफी बुरे हैं। डिफ़ॉल्ट मान वास्तव में कॉलिंग बाइनरी में संकलित होता है और यदि आप बाद में डिफ़ॉल्ट को बदलने का निर्णय लेते हैं, तो उस विधि को कॉल करने वाली सभी असेंबली को नए मान का उपयोग करने के लिए पुन: संकलित करने की आवश्यकता होती है। – jessehouwing

+0

ओह, द्विआधारी कॉलिंग? मुझे नहीं पता था ... –

+0

हां, इस तरह यह एक कंपाइलर सुविधा है और भाषा सुविधा नहीं है। यह बुरा है** ;)। – jessehouwing

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