Представьте, что вы отправили друга в магазин с деньгами на общий счёт. Он может потратить их на что угодно, при этом никому не отчитываясь. Вот примерно так же работает
static с изменяемым состоянием. Удобно? Да. Безопасно? Совсем нет.Почему
static плохо сочетается с даннымиStatic — это ключевое слово, которое любят новички и используют для удобства. А потом из этого вырастают проблемы, которые отъедают часы отладки. Главная беда в том, что статические поля существуют всё время работы программы и доступны отовсюду.
Четыре золотых правила
1. Статические поля могут быть только для чтения. Лучше — константы.
2. Статические методы должны работать как математические функции: дали параметры — получили результат. Никаких побочных эффектов, никаких изменений состояния. Например:
Select, Where, First из LINQ — это всё статические методы расширения, которые не трогают исходную последовательность.3. Если в классе есть методы, которые не используют поля экземпляра, эту логику лучше вынести в отдельный статический класс-помощник. Это делает код чище, тесты проще.
4. Если вы создаёте статическое поле, пусть оно указывает на что-то, что не меняется. На объект конфигурации? Хорошо. На список данных, который вы потом модифицируете? Катастрофа.
Когда
static — ваш друг• Вспомогательные классы с чистыми функциями
Создайте статический класс
StringUtils с методом static string ToPascalCase(string input). Нет состояния, нет побочных эффектов, нет проблем. Это хорошее использование.• Методы расширения для преобразований
Select, Where и компания — статические методы расширения, которые берут данные, преобразуют их и возвращают новые. Функциональный подход, никакого волшебства.• ThreadStatic для действительно отдельного состояния
Если каждому потоку нужно своё состояние, можно использовать
ThreadStatic. Но даже здесь нужна осторожность — каждый поток всё равно должен управлять своим состоянием.Передайте зависимость через конструктор, используйте DI-контейнер, создайте объект на сессию. Ваш будущий я, сидящий в отладчике в три утра, скажет вам спасибо.
🐸Библиотека шарписта
#il_люминатор
