Почему предпочитают статический класс одноэлементной реализации?

Я не знаю, относится ли это к Вам, но что я делал много раз для сохранения меня, деньги, спрашивает пользователь в его профиле, каков его поставщик услуг, затем пытался соответствовать ему this list . По существу многие/больше всего поставщикам услуг подключили адрес электронной почты к номеру телефона, который легко позволит Вам отправить тексты в число. Например, если у Вас будет ATT, и Ваш номер телефона 786-262-8344, то электронное письмо на 7682628344@txt.att.net отправит Вам текстовое сообщение с предметом/телом электронной почты, бесплатно. Эта техника в значительной степени покроет всех Ваших американских пользователей бесплатно. Очевидно, в зависимости от потребностей Вашего приложения это не может быть возможно/соответствующим/требовать, но это - опция знать.

30
задан user 3 June 2012 в 14:55
поделиться

4 ответа

Статический класс - это технический инструмент в вашем ящике - в основном функция языка.

Синглтон - это архитектурная концепция.

Вы можете использовать статический класс как средство для реализации синглтона. концепция. Или вы можете использовать другой подход.

Со статическими классами в C # есть две потенциальных опасности, если вы не будете осторожны.

  • Запрошенные ресурсы не будут освобождены до конца жизненного цикла приложения.
  • Значения статических переменных совместно используются в приложении. Особенно плохо для приложений ASP.NET, поскольку эти значения затем будут совместно использоваться всеми пользователями сайта, находящегося в определенном домене приложения.
40
ответ дан 27 November 2019 в 23:18
поделиться

Из MSDN

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

A key point is that static classes do not require an instance reference. Also note that static classes are specifically enabled by the language and compiler.

Singleton classes are just user coded classes implementing the Singleton design pattern. Singleton purpose is to restrict instantiation of an class to a single instance.

If you coded every static class as a singleton you'd have to instantiate the class every time you used it.

i.e.

Console.WriteLine('Hello World');

would become

Console c = Console.getInstance();
c.WriteLine('Hello World');
23
ответ дан 27 November 2019 в 23:18
поделиться

Я бы сказал, что оба они (как правило) плохие решения. Есть несколько вариантов использования статических классов, в первую очередь простые служебные (на ум приходят методы расширения в C # 3.0). Однако при любой степени сложности проблемы с тестируемостью начинают возникать.

Допустим, класс A зависит от статического класса B. Вы хотите протестировать класс A изолированно. Это сложно.

Итак, вы выбираете синглтон. У вас та же проблема - класс A зависит от синглтона B. Вы не можете тестировать класс A изолированно.

Когда класс B имеет другие зависимости (например, обращение к базе данных) или является изменяемым (другие классы могут изменять свое глобальное состояние ) проблема усугубляется.

Контейнерные библиотеки IoC ( Inversion of Control ) - одно из решений этой проблемы; они позволяют вам определять простые старые классы как имеющие долгую жизнь.

9
ответ дан 27 November 2019 в 23:18
поделиться

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

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

6
ответ дан 27 November 2019 в 23:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: