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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
7
0
1 557
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

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

Что вы имеете в виду под «опасностью»?

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

spender 09.12.2008 13:43

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

Ответ принят как подходящий

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

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

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

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

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

Фактически, если нет статического конструктора (в отличие от инициализаторов статических переменных), тип, вероятно, будет инициализирован раньше, чем это необходимо.

Jon Skeet 09.12.2008 14:05

«Ленивые» статические конструкторы - не проблема. Вы можете создать статическую процедуру инициализации вручную вместо статического конструктора.

macropas 09.12.2008 14:41

Я не собирался говорить, что «ленивый» - это проблема. Псевдоним для одноэлементного шаблона - «Ленивая инициализация». Я часто вижу, что синглтоны и / или статические классы используются как замена глобальным переменным.

TomTom 09.12.2008 15:50

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

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

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

Конечно, если нет необходимости в реализации интерфейса или стандартной сериализации. Я согласен с Марком Гравеллом

macropas 09.12.2008 14:38

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

Другие вопросы по теме