2009-06-02 6 views
3

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

ответ

7

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

6

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

2

Ответ заключается в том, что если программа работает и поддерживается, сделайте это.

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

8

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

public const double ScaleFactor = 1; 

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

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


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

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

+1

Единственное, что следует учитывать при использовании функции const: Когда вы перекомпилируете свой компонент и измените значение const, все модули, которые используют эту константу, также должны быть перекомпилированы для правильного значения. Это позволяет избежать использования статического readonly. – SACO

1

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

Смежные вопросы