2012-02-10 7 views
12

Desidero eseguire parte del mio programma della riga di comando in parallelo con più thread e temo che potrebbe esserci qualche variabile statica che devo correggere (ad esempio, rendendola [ThreadStatic]). C'è qualche strumento o un modo semplice per trovarli nel mio progetto?Come posso trovare tutte le variabili statiche nel mio progetto C#?

Naturalmente semplicemente alla ricerca di "static" non aiuta molto: ho un sacco di metodi statici che funzionano molto bene e finde con qualsiasi numero di thread

+3

si potrebbe ovviamente utilizzare la riflessione sul proprio assieme. Ma non lo so, se questo fosse come lasciare che un bulldozer pulisca il tuo cortile. – user492238

+1

Sono tutto per l'approccio bulldozer. – Zenexer

risposta

11

La ricerca dei file per static:b+:i:b+:i:b*[=;] con l'opzione regexp in Visual Studio dovrebbe generare variabili statiche. Porterà anche operatori ==, ma dovrebbero essere relativamente facili da filtrare visivamente.

+3

Ooo, aspetta, è un bel trucco. Penso che funzionerebbe con pochi falsi positivi. +1 – Zenexer

+1

Fantastico! Grazie! Funziona molto bene! – Christian

1

Il modo più semplice per vedere tutti i vostri campi statici in un unico luogo è probabile verrà visualizzato tramite il pannello Visualizzazione classi in Visual Studio (Ctrl + W, C per impostazione predefinita in modalità C#, anche sotto il menu View).

È possibile impostare alcuni filtri primitivi. Sfortunatamente, la statica non è una di queste. Tuttavia, potresti essere in grado di utilizzare i filtri disponibili per ridurre i risultati, in base al tuo stile di codifica.

In alternativa, è possibile creare un programma che utilizza la riflessione per estrarre ciascun campo statico e controllarne gli attributi. Se ThreadStaticAttribute non è tra questi, sputa un messaggio. (Questa è la falsariga di un'altra risposta, dalla quale potresti ottenere maggiori dettagli.)

3

Oltre ai trucchi IDE, un vero guerriero userebbe Assembly.Load() per caricare la DLL dell'applicazione nella memoria e quindi utilizzando la ricerca di riflessione attraverso tutti i tipi di campi statici pubblici/privati ​​/ protetti. :)

+1

E quindi controllare gli attributi personalizzati per vedere se 'ThreadStaticAttribute' manca. Se è così, bandiere rosse. – Zenexer

11

Nota: La risposta di dasblinkenlight funziona solo su Visual Studio 2010 e precedenti.

Di seguito si riporta la traduzione per Visual Studio 2012 e successivi:

static(?([^\r\n])\s)+(\b(_\w+|[\w-[0-9_]]\w*)\b)(?([^\r\n])\s)+(\b(_\w+|[\w-[0-9_]]\w*)\b)(?([^\r\n])\s)*[=;]

traduzione è stata fatta riferimento: http://msdn.microsoft.com/en-us/library/2k3te2cs(v=vs.110).aspx

+2

Ad ogni modo, per risolvere il problema di quanto sopra, mancheranno i membri addizionalmente decorati, usare la seguente regex difficile da leggere ma efficace: '(statico (? ([^ \ R \ n]) \ s) + (\ b (_ \ w + | [\ w- [0-9 _]] \ w *) \ b) (([^ \ r \ n]) \ s?) + (\ b (_ \ w + | [\ W- [0-9 _]] \ w *) \ b) (([^ \ r \ n]) \ s) * [=;?]) | (statico (([^ \ r \ n]) \ s) + (\ b (_ \ w + | [\ w- [0-9 _]] \ w *) \ b) (? ([^ \ r \ n]) \ s) + (\ b (_ \ w + | [\ w- [0-9 _]] \ w *) \ b) (([^ \ r \ n]) \ s) + (\ b (_ \ w + |? [\ w- [0-9_] ] \ w *) \ b) (? ([^ \ r \ n]) \ s) * [=;]) ' –

+1

ReFiddle per comodità e per non avere problemi di copia/incolla: http://refiddle.com/ hhg –

+0

Questo non funziona su campi di tipi generici, come ad esempio Dizionario . –

1

Prima di tutto bisogna aprire Find in Files finestre dal Edit->Find and Replace->Find in Files menu o Ctrl + Tasti di scelta rapida Maiusc + F.

Quindi è necessario utilizzare questo espressioni regolari per cercare tutti i tuo variabili statiche in Current Project o in Entire Solution:

static \w*[ \t]*\b(\w+|[\w-[0-9]]\w)\b[ \t]+\b(\w+|[\w-[0-9]]\w*)\b[ \t]*[=;] 

Mente selezionare l'opzione Use Regular Expressions in Find options sezione.

Questa regex supportava anche readonly, virtual, ...