Когда использовать статические переменные? - PullRequest
3 голосов
/ 03 июня 2009

В настоящее время я делаю проект на C # с большим рендерингом, и почти во всех классах есть постоянное значение типа integer, используемое для масштабирования рендеринга. Я знаю, что мог бы определить эту константу в одном месте как нормальную переменную и затем передать ее, но это кажется действительно громоздким. Когда допустимо использовать статические переменные в C #? Самым простым решением моей проблемы было бы создание класса, содержащего статическую переменную, на которую могли бы ссылаться все другие классы - это будет плохой дизайн?

Ответы [ 5 ]

8 голосов
/ 03 июня 2009

Как константа это значение? static подходит для вещей, которые readonly, но вы можете быстро попасть в беспорядок, если он не readonly - особенно если у вас несколько потоков. Коэффициент масштабирования для меня не выглядит жесткой константой, то есть это не так:

public const double ScaleFactor = 1;

Я бы без колебаний использовал статическую переменную для чего-то, что я загружаю один раз и оставляю в покое. Кроме этого, я бы, вероятно, инкапсулировал (в вашем случае) какой-то RenderContext с этим значением и любыми другими служебными методами - и передавал RenderContext между методами; это также может помочь вам абстрагироваться от базовой реализации, если вам нужно выполнить модульное тестирование и т. д.

Когда вы обнаружите, что вам нужно больше свойств (и это неизбежно потребуется), вы просто расширяете класс RenderContext - больше ничего не меняется.


(редактировать)

Кроме того - подумайте о будущем: будете ли вы когда-нибудь делать более одного рендера одновременно? Поскольку у нас у всех сейчас много ядер и т. Д., Статические данные хороши, если все потоки имеют одинаковое значение. Есть [ThreadStatic], но это немного грязно по сравнению.

7 голосов
/ 03 июня 2009

Неплохой дизайн вообще. Фактически, наличие пространства имен и класса Common или Utility, которые предоставляют статические методы и статические значения, централизует эти значения в одном месте, так что вы можете убедиться, что каждый модуль в вашем приложении использует соответствующие значения. Это низкая сплоченность, но приемлемая для пользы. Я не вижу проблем с этим.

6 голосов
/ 03 июня 2009

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

2 голосов
/ 03 июня 2009

Ответ таков: если программа работает и ее можно обслуживать, сделайте это.

Статические переменные не грех, просто полезно знать, когда их использовать. :)

1 голос
/ 03 июня 2009

Если все ваши классы должны понимать это значение + делать что-то еще, то (если это не что-то вроде пи) вы, вероятно, должны проверить, что у ваших классов есть одна проблема. Возможно, это «значение» должно стать объектом, который может выполнять операции, которые в настоящее время выполняются по всей вашей кодовой базе?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...