Статические классы в c # - PullRequest
       20

Статические классы в c #

7 голосов
/ 09 декабря 2008

Отвечая на этот вопрос (https://stackoverflow.com/questions/352317/c-coding-question#352327),, меня удивило ...

Есть ли какая-либо опасность, если рассматривать статический класс как эквивалент нестатического класса, который реализует шаблон синглтона?

Ответы [ 8 ]

10 голосов
/ 09 декабря 2008

Единственное, что кажется мне сразу очевидным, - это то, что статический класс - это просто набор функций с областями видимости (здесь явно не используются «методы»), а синглтон - это то, что вы можете создать, даже если у вас есть только 1 . 1> 0.

Вы можете передать синглтон в качестве аргумента чему-то, что ожидает объект определенного интерфейса, вы не можете никуда передавать статический класс (кроме как с помощью некоторой хитрости отражения)

4 голосов
/ 09 декабря 2008

Во многих отношениях статический класс и синглтон похожи. Одно большое отличие состоит в том, что в синглтоне могут быть реализованы некоторые интерфейсы, что невозможно для статического класса. Например, Comparer<T>.Default / EqualityComparer<T>.Default предоставляют (через интерфейс) возможность использовать элемент в сортировке / использовании словаря.

Также возможно (хотя и сложно) использовать синглтон со стандартными средами сериализации. Со статическим классом вам придется управлять любым состоянием состояния вручную.

2 голосов
/ 09 декабря 2008

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

Что вы подразумеваете под "опасностью"?

1 голос
/ 09 декабря 2008

Основная опасность, которую я вижу со статическими классами, заключается в том, что их гораздо труднее высмеивать при написании юнит-тестов. С помощью синглтона вы можете создать его таким образом, чтобы вместо него можно было внедрить другой класс, который выполняет тестирование определенной функциональности, со статическим классом это не так просто.

1 голос
/ 09 декабря 2008

Как указал Роберт Гулд, вы теряете контроль над строительством. Вы также получите проблемы со строительством, которые намного более неясны. Статические классы быстро заканчиваются статическими блоками инициализатора. Эти блоки вызываются в первый раз, когда кто-то ссылается на ваш тип, и этот порядок может быть не так хорошо определен, как вам кажется. Таким образом, порядок выполнения этих статических инициализаторов может измениться без вашего планирования и может вызвать странные ошибки.

0 голосов
/ 09 декабря 2008

В контексте реализации синглтона, я думаю, нет никакой опасности. Я часто делаю то же самое, внедряя синглет в статическом классе. Логически, ссылка на объект не обязательна, если она одна и уникальна.

0 голосов
/ 09 декабря 2008

Как уже говорил Роберт, инициализация является основным недостатком статического класса. Статический класс обычно инициализируется лениво, в самый последний момент. Однако вы теряете контроль над точным поведением, а статические конструкторы работают медленно.

Часто статические классы используются для хранения глобальных данных. А глобальные данные создают неявную зависимость между вашими другими объектами / классами. Таким образом, вы должны быть осторожны при изменении этого «глобального объекта». Может сломать ваше приложение.

0 голосов
/ 09 декабря 2008

Не уверен насчет C #, но в C ++ статический объект инициализируется при инициализации, и у вас нет прямого контроля над этим (особенно в многопоточных приложениях). Так что вам нужна функция для вызова вашего объекта, а не просто для непосредственного вызова (если вы не хотите непереносимый код)

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