2015-05-16 9 views
9

मैं एक वर्ग में एक (सी #) struct परिवर्तित की सभी संदर्भों को खोजने के लिए और सुनिश्चित करने के लिए पूर्व निहित नकल का कोई अनचाहे प्रभाव को देखते हैं कि प्रकार के सभी उपयोगों के माध्यम से जाने के लिए और अब संदर्भ व्यवहार करने की जरूरत है ।दृश्य स्टूडियो: एक विशेष प्रकार

क्या सभी संदर्भों को खोजने का कोई तरीका है, जहां इस विशिष्ट प्रकार का उपयोग/शामिल है?

मैं प्रकार पर Find all References की कोशिश की, और सभी स्थानों में जहां प्रकार का नाम स्पष्ट रूप कहा गया है, जो एक अच्छी शुरुआत है मिलता है।

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

क्या कोई विशेषताएं या चाल मैं उपयोग कर सकता हूं? मुझे लगता है, स्ट्रक्चर-टू-क्लास रूपांतरण का यह विशेष मामला अक्सर होता है। हो सकता है कि आपके पास कुछ सलाह हो कि सभी संभावित मुद्दों को कैसे ढूंढें?

+2

एक परिवर्तनीय 'संरचना' एक ** खराब ** विचार है। – xanatos

+1

यदि आप अपनी संरचना को अपरिवर्तनीय बनाते हैं, तो आपको उन मुद्दों में से किसी के बारे में चिंता करने की ज़रूरत नहीं है। संरचना डिज़ाइन दिशानिर्देश देखें: https://msdn.microsoft.com/en-us/library/ms229031%28v=vs.110%29.aspx –

+0

हां, परिवर्तनीय structs खराब हैं, लेकिन सुविधाजनक हैं। लेकिन आप सही हैं। अब मुझे परिणामों का सामना करना पड़ेगा;) – azt

उत्तर

5

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

आप [Obsolete] वर्ग के रूप में चिह्नित कर सकता है अपने सभी गुण, अपने सभी तरीकों। फिर हर बार जब आप उनका इस्तेमाल करते थे तो आपको चेतावनी होगी।

नोट [Obsolete] "चाल" कुछ सीमाएँ हैं कि:

[Obsolete] 
public class MyClass 
{ 
} 

public static void Test1(MyClass test2) // This line has a warning 
{ 
    var y = test2; // ***This line doesn't have a warning*** 
    MyClass z = test2; // This line has a warning 
} 

तो यह Find all References रूप में ही है ...

एक अन्य समाधान, विजुअल स्टूडियो के FxCop/कोड विश्लेषण के आधार पर:

यह कोई कस्टम नियम, http://blogs.msdn.com/b/codeanalysis/archive/2010/03/26/how-to-write-custom-static-code-analysis-rules-and-integrate-them-into-visual-studio-2010.aspx

विधानसभा की डिफ़ॉल्ट नाम स्थान के निर्देशों के आधार पर है ब्ली (आप गुणों में सेट कर सकते हैं) MyCustomFxCopRules होना चाहिए। प्लेटफार्म लक्ष्य x86।

using Microsoft.FxCop.Sdk; 

namespace MyCustomFxCopRules 
{ 
    public class StructAssignmentFinder : BaseIntrospectionRule 
    { 
     public StructAssignmentFinder() 
      : base("StructAssignmentFinder", "MyCustomFxCopRules.RuleMetadata", typeof(StructAssignmentFinder).Assembly) 
     { 
      var ms = new MyStruct(); 
      var tt = ms; 
     } 

     public override TargetVisibilities TargetVisibility 
     { 
      get 
      { 
       return TargetVisibilities.All; 
      } 
     } 

     public override ProblemCollection Check(ModuleNode module) 
     { 
      Visit(module); 
      return Problems; 
     } 

public override void VisitAssignmentStatement(AssignmentStatement assignment) 
{ 
    // You could even use FullName 
    if ((assignment.Source != null && assignment.Source.Type != null && assignment.Source.Type.Name.Name == "MyStruct") || 
     (assignment.Target != null && assignment.Target.Type != null && assignment.Target.Type.Name.Name == "MyStruct")) 
    { 
     Problem problem = new Problem(GetNamedResolution("Struct", assignment.Target.Type.Name.Name), assignment); 
     Problems.Add(problem); 
    } 

    base.VisitAssignmentStatement(assignment); 
} 

public override void VisitConstruct(Construct construct) 
{ 
    Method targetMethod = (Method)((MemberBinding)construct.Constructor).BoundMember; 

    if (targetMethod.Parameters.Any(x => x.Type.Name.Name == "MyStruct")) 
    { 
     Problem problem = new Problem(GetNamedResolution("ParameterType", "MyStruct", targetMethod.Name.Name), construct); 
     Problems.Add(problem); 
    } 

    base.VisitConstruct(construct); 
} 

public override void VisitMethodCall(MethodCall call) 
{ 
    Method targetMethod = (Method)((MemberBinding)call.Callee).BoundMember; 

    if (targetMethod.ReturnType.Name.Name == "MyStruct") 
    { 
     Problem problem = new Problem(GetNamedResolution("ReturnType", targetMethod.ReturnType.Name.Name, targetMethod.Name.Name), call); 
     Problems.Add(problem); 
    } 

    if (targetMethod.Parameters.Any(x => x.Type.Name.Name == "MyStruct")) 
    { 
     Problem problem = new Problem(GetNamedResolution("ParameterType", "MyStruct", targetMethod.Name.Name), call); 
     Problems.Add(problem); 
    } 

    base.VisitMethodCall(call); 
} 

RuleMetadata.xml (यह एक एंबेडेड संसाधन होना चाहिए)

<?xml version="1.0" encoding="utf-8" ?> 
<Rules FriendlyName="Rules about Structs"> 
    <Rule TypeName="StructAssignmentRule" Category="MyRules" CheckId="CR1000"> 
    <Name>Struct Assignment Finder</Name> 
    <Description>Struct Assignment Finder</Description> 
    <Url></Url> 
    <Resolution Name="Struct">There is an assignment of struct '{0}'.</Resolution> 
    <Resolution Name="ReturnType">'{0}' is the return type for a call to '{1}'.</Resolution> 
    <Resolution Name="ParameterType">'{0}' is a parameter type for a call to '{1}'.</Resolution> 
    <Email></Email> 
    <MessageLevel Certainty="100">Warning</MessageLevel> 
    <FixCategories>NonBreaking</FixCategories> 
    <Owner></Owner> 
    </Rule> 
</Rules> 

इस आधार पर, यह अन्य कोने मामलों है कि मैं निश्चित रूप से :-) भूल

के लिए अन्य नियमों को जोड़ने के लिए तो आसान है

परीक्षण फ़ाइल मैं उपयोग कर रहा था:

public struct MyStruct 
{ 

} 

class Test 
{ 
    public Test() 
    { 
     var ms = new MyStruct(); 
     var ms2 = ms; 

     ms3 = ms; 
     ms = ms3; 

     ms4 = ms; 
     ms = ms4; 

     ms4 = ms4; 

     new MyObject(default(MyStruct)); 
    } 

    public MyStruct ms3; 
    public MyStruct ms4 { get; set; } 
} 

public class MyObject 
{ 
    public MyObject(MyStruct par1) 
    { 

    } 
} 

ध्यान दें कि डिबगिंग नियमों मुश्किल है ... यह है FxCopCmd.exe के साथ डीबग करना काफी आसान है, लेकिन विजुअल स्टूडियो द्वारा सीधे कॉल किए जाने पर डीबग करने के लिए असंभव (मुझे लगता है, यकीन नहीं है)।

+0

आपकी दोनों टिप्पणियां सभी संदर्भों के समान ही कम हैं। वीएस ने फीचर पेश करने से पहले नाम बदलने का इस्तेमाल किया। 'अप्रचलित] 'चाल नहीं पता था। किसी भी तरह से, सीधे मुझे यहां मदद नहीं करेगा। – azt

+0

@azt एक सैद्धांतिक दृष्टिकोण से, सभी असाइनमेंट खोजने के लिए आईएल विश्लेषक को संशोधित करना संभव है ... अंत में आपको केवल अपने प्रकार के सभी 'stloc' को ढूंढना होगा, सभी विधि कॉल जिनमें पैरामीटर है आपका प्रकार और इतने पर ... – xanatos

+0

@azt विजुअल स्टूडियो के कोड विश्लेषण का उपयोग करना संभव है ... आपको एक कस्टम नियम लिखना है ... लेकिन इसे डीबग करना बहुत मुश्किल है :-( – xanatos

1

आप एक एक समय में वर्ग गैर-निजी सदस्यों में से प्रत्येक के, एक पर सभी संदर्भ ढूंढ़ें कर सकता है। यह प्रत्येक सदस्यों को पढ़ने और लिखने के लिए दिखाएगा।

+0

उसने इसे लिखा प्रश्न * मैंने कोशिश की ** सभी संदर्भ ** प्रकार खोजें, और उन सभी स्थानों को प्राप्त करें जहां टाइप नाम स्पष्ट रूप से कहा गया है, जो एक अच्छी शुरुआत है। * – xanatos

+1

इस प्रकार के सभी संदर्भ खोजें एक बात है। यह प्रत्येक को इंगित करेगा जगह जहां नाम का नाम स्पष्ट रूप से टाइप किया गया है। कहें, एक वर्ग संपत्ति पर सभी संदर्भ खोजें, वह स्थान जहां वह संपत्ति पढ़ी गई थी या लिखी गई थी, जो ओपी के वर्णन के समान नहीं है। –

+0

आप सही हैं, यह जरूरी नहीं है निहित प्रतियां मुझे चिंता करने की ज़रूरत है, लेकिन सार्वजनिक सदस्यों को लिखती है। – azt

2

जवाब और टिप्पणियों मुझे एक संतोषजनक समाधान पैदा हुआ, जिसे संभवतः दूसरों में मदद करता है, तो मैंने सोचा कि मैं इसे पोस्ट चाहते हैं।

प्रश्न सभी उपयोगों को खोजने के लिए इतना नहीं था, लेकिन केवल "समस्याग्रस्त" वाले, अर्थात् लेखन सार्वजनिक सदस्यों तक पहुंच जाता है। this answer में सुझाए गए सदस्यों के सभी संदर्भों को ढूंढने के बजाय, मैं केवल लेखन पहुंच ढूंढना चाहता हूं। इसलिए, मैंने this answer में संकेत की तरह एक पुनर्लेखन रणनीति का उपयोग किया और सभी सदस्यों को केवल लिखने के लिए बनाया, इसलिए संकलक केवल खतरनाक लेखन पहुंच के बारे में शिकायत करेगा।

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

केवल समस्या को संरचना के डिफ़ॉल्ट रचनाकारों को कॉल किया गया था, जो अब कक्षा में मौजूद नहीं था। लेकिन अब मुझे उनकी आवश्यकता नहीं है, क्योंकि कक्षा के साथ मैं इन मामलों को बस null पर सेट कर सकता हूं।

0

यदि आपके पास विजुअल स्टूडियो वेब अनिवार्य एक्सटेंशन स्थापित है तो यह बहुत आसान है। नीचे स्क्रीनशॉट जांचें। लाल रंग में हाइलाइट किए गए लिंक पर क्लिक करने पर आप विशेष प्रकार के सभी संदर्भ देख सकते हैं। enter image description here

+0

क्या आप वाकई विजुअल स्टूडियो परम का हिस्सा नहीं हैं? – JavierIEH

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