2012-02-10 8 views
12

Quiero ejecutar una parte de mi programa de línea de comandos en paralelo con varios subprocesos y me temo que puede haber alguna variable estática restante que deba arreglar (por ejemplo, haciéndolo [ThreadStatic]). ¿Hay alguna herramienta o forma fácil de encontrar estos en mi proyecto?¿Cómo puedo encontrar todas las variables estáticas en mi proyecto C#?

Por supuesto, la simple búsqueda de "static" no ayuda mucho: Tengo un montón de métodos estáticos que funcionan muy bien y el finde con cualquier número de hilos

+3

por supuesto, puede utilizar la reflexión en su conjunto. Pero no sé, si esto fuera como dejar que una excavadora limpie tu patio trasero. – user492238

+1

Estoy a favor del enfoque de bulldozer. – Zenexer

Respuesta

11

Buscando sus archivos para static:b+:i:b+:i:b*[=;] con la opción de expresión regular en Visual Studio debe aparecer variables estáticas para usted. También traerá operadores ==, pero deberían ser relativamente fáciles de filtrar visualmente.

+3

Ooo, espera, es un buen truco. Creo que funcionaría con pocos falsos positivos. +1 – Zenexer

+1

¡Impresionante! ¡Gracias! Funciona muy bien! – Christian

1

La forma más fácil de encontrar todos sus campos estáticos en un solo lugar es probable va a ser a través del panel de vista de clase en Visual Studio (Ctrl + W, C de forma predeterminada en el modo C#, también en el menú View).

Puede establecer algunos filtros primitivos. Desafortunadamente, la estática no es una de ellas. Sin embargo, es posible que pueda usar los filtros disponibles para adelgazar los resultados, de acuerdo con su estilo de codificación.

Alternativamente, podría hacer un programa que use la reflexión para extraer cada campo estático y verificar sus atributos. Si ThreadStaticAttribute no está entre ellos, haga que escuche un mensaje. (Esto es a lo largo de las líneas de otra respuesta, de la cual es posible que pueda obtener más detalles.)

3

Además de los trucos de IDE, una verdadera forma de guerrero sería usar Assembly.Load() para cargar la DLL de aplicación en la memoria y luego usar la búsqueda de reflexión a través de todos los tipos de campos estáticos públicos/privados/protegidos. :)

+1

Y luego verificar los atributos personalizados para ver si falta 'ThreadStaticAttribute'. Si es así, banderas rojas. – Zenexer

11

Nota: la respuesta de dasblinkenlight funciona solo en Visual Studio 2010 y anteriores.

continuación es la traducción para Visual Studio 2012 y posteriores:

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

La traducción se hizo referencia: http://msdn.microsoft.com/en-us/library/2k3te2cs(v=vs.110).aspx

+2

Por cierto, para solucionar el problema de que lo anterior se perderá cualquier miembro decorado adicionalmente, use la siguiente expresión regular difícil de leer pero efectiva: '(estática (? ([^ \ R \ n]) \ s) + (\ b (_ \ w + | [\ w- [0-9 _]] \ w *) \ b) (? ([^ \ r \ n]) \ s) + (\ b (_ \ w + | [\ w- [0-9 _]] \ w *) \ b) (? ([^ \ r \ n]) \ s) * [=;]) | (estática (? ([^ \ 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 para mayor comodidad y para no tener problemas de copiar/pegar: http://refiddle.com/ hhg –

+0

Esto no funciona en campos de tipos genéricos, como Dictionary . –

1

En primer lugar hay que abrir Find in Files ventanas de Edit->Find and Replace->Find in Files menú o Ctrl + Shift + F teclas de método abreviado.

entonces usted tiene que utilizar estos expresiones regulares para buscar todas las variables estáticas de los suyos en Current Project o en Entire Solution:

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

mente marque la opción Use Regular Expressions en Find options sección.

Esta expresión regular también es compatible con readonly, virtual, ...

Cuestiones relacionadas