2012-02-10 2 views
12

Я хочу запустить часть моей командной строки параллельно с несколькими потоками, и я боюсь, что может быть какая-то статическая переменная, которую я должен исправить (например, сделав ее [ThreadStatic]). Есть ли какой-нибудь инструмент или простой способ найти их в моем проекте?Как найти все статические переменные в моем проекте C#?

Конечно, просто ищет "static" не очень помогает: У меня есть много статических методов, которые работают большой и Finde с любым количеством нитей

+3

Вы можете, конечно, использовать отражение на своем собрании. Но я не знаю, если это будет похоже на то, чтобы бульдозер очистил ваш задний двор. – user492238

+1

Я все для подхода бульдозера. – Zenexer

ответ

11

Поиск файлов для static:b+:i:b+:i:b*[=;] с параметром regexp в Visual Studio должен включать статические переменные для вас. Это также приведет операторов ==, но их относительно легко отфильтровать визуально.

+3

Ооо, подождите, это аккуратный трюк. Я думаю, что это будет работать с несколькими ложными срабатываниями. +1 – Zenexer

+1

Удивительный! Благодаря! Работает очень хорошо! – Christian

1

Самый простой способ найти все ваши статические поля в одном месте, скорее всего, будет проходить через панель «Вид класса» в Visual Studio (Ctrl + W, C по умолчанию в режиме C# - также в меню «View»).

Вы можете установить некоторые примитивные фильтры. К сожалению, статичность не является одним из них. Тем не менее, вы можете использовать доступные фильтры, чтобы уменьшить результаты, основываясь на вашем стиле кодирования.

В качестве альтернативы вы можете создать программу, которая использует отражение, чтобы вытащить каждое статическое поле и проверить его атрибуты. Если ThreadStaticAttribute не среди них, имейте это сообщение. (Это соответствует еще одному ответу, из которого вы могли бы получить более подробную информацию.)

3

Помимо трюков IDE, реальный воин мог использовать Assembly.Load() для загрузки DLL приложения в память, а затем с помощью поиска отражений через все типы для статических полей public/private/protected. :)

+1

Затем проверьте пользовательские атрибуты, чтобы увидеть, отсутствует ли 'ThreadStaticAttribute'. Если да, то красные флаги. – Zenexer

11

Примечание: Ответы dasblinkenlight работают только на Visual Studio 2010 и старше.

Ниже перевод Visual Studio 2012 и новее:

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

Перевод был сделан реферирования: http://msdn.microsoft.com/en-us/library/2k3te2cs(v=vs.110).aspx

+2

Кстати, чтобы решить вопрос о том, что вышесказанное пропустит какие-либо дополнительные элементы, используйте следующее труднодоступное для чтения, но эффективное регулярное выражение: '(static (? ([^ \ R \ n]) \ s) + (\ б (_ \ ш + | [\ w- [0-9 _]] \ ш *) \ б) (([^ \ г \ п]) \ s?) + (\ Ь (_ \ ш + | [\ W- [0-9 _]] \ ш *) \ б) (([^ \ г \ п]) \ с) * [=;?]) | (статический (([^ \ г \ п]) \ s) + (\ Ь (_ \ ш + | [\ w- [0-9 _]] \ ш *) \ б) (? ([^ \ г \ п]) \ s) + (\ Ь (_ \ ш + | [\ w- [0-9 _]] \ ш *) \ б) (([^ \ г \ п]) \ s) + (\ Ь (_ \ ш + |? [\ w- [0-9_] ] \ w *) \ b) (? ([^ \ r \ n]) \ s) * [=;]) ' –

+1

ReFiddle для удобства и не иметь проблем с копированием/вставкой: http://refiddle.com/ hhg –

+0

Это не работает в полях общих типов, таких как словарь . –

1

Прежде всего, вы должны открыть Find in Files окна из Edit->Find and Replace->Find in Files меню или Ctrl + Shift + F.

Тогда вы должны использовать эти регулярные выражения для поиска все из ваших статических переменных в Current Project или в Entire Solution:

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

Разум флажок Use Regular Expressions в Find options разделе.

Это регулярное выражение также поддерживается только для чтения, виртуальным, ...