Что такое синглтон в C #?

Довольно прямой вопрос.

Что такое Синглтон и когда я должен его использовать?

Singleton – это class, который позволяет только создать один экземпляр для себя – и дает простой и легкий доступ к указанному экземпляру. Одиночная посылка является образцом для разработки программного обеспечения.

Существует реализация C # «Внедрение шаблона Singleton в C #», охватывающая большую часть того, что вам нужно знать, включая некоторые полезные рекомендации по безопасности streamов .

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

Вы попросили C #. Тривиальный пример:

 public class Singleton { private Singleton() { // Prevent outside instantiation } private static readonly Singleton _singleton = new Singleton(); public static Singleton GetSingleton() { return _singleton; } } 

Что это такое: class, для которого есть только один, постоянный экземпляр на протяжении всего срока службы приложения. См. Шаблон Singleton .

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

другой способ реализовать singleton в c #, я лично предпочитаю этот способ, потому что вы можете получить доступ к экземпляру classа singeton в качестве свойства вместо метода.

 public class Singleton { private static Singleton instance; private Singleton() { } public static Singleton Instance { get { if (instance == null) instance = new Singleton(); return instance; } } //instance methods } 

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

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

Хотя там может быть только один экземпляр синглтона, это не то же самое, что статический class. Статический class может содержать только статические методы и никогда не может быть создан, тогда как экземпляр singleton может использоваться так же, как и любой другой объект.

 using System; using System.Collections.Generic; class MainApp { static void Main() { LoadBalancer oldbalancer = null; for (int i = 0; i < 15; i++) { LoadBalancer balancerNew = LoadBalancer.GetLoadBalancer(); if (oldbalancer == balancerNew && oldbalancer != null) { Console.WriteLine("{0} SameInstance {1}", oldbalancer.Server, balancerNew.Server); } oldbalancer = balancerNew; } Console.ReadKey(); } } class LoadBalancer { private static LoadBalancer _instance; private List _servers = new List(); private Random _random = new Random(); private static object syncLock = new object(); private LoadBalancer() { _servers.Add("ServerI"); _servers.Add("ServerII"); _servers.Add("ServerIII"); _servers.Add("ServerIV"); _servers.Add("ServerV"); } public static LoadBalancer GetLoadBalancer() { if (_instance == null) { lock (syncLock) { if (_instance == null) { _instance = new LoadBalancer(); } } } return _instance; } public string Server { get { int r = _random.Next(_servers.Count); return _servers[r].ToString(); } } } 

Я взял код с dofactory.com , ничего такого не интересного , но я нахожу это намного лучше, чем примеры с Foo и Bar, дополнительно книги от Judith Bishop на C # 3.0 Design Patterns имеют пример об активном приложении в mac dock.

Если вы посмотрите на код, мы фактически создаем новые объекты для цикла for , чтобы создать новый объект, но повторный экземпляр, в результате которого oldbalancer и newbalancer имеют один и тот же экземпляр, How? его из-за статического ключевого слова, используемого в функции GetLoadBalancer () , несмотря на то, что у него разное значение сервера, которое является случайным списком, static на GetLoadBalancer () принадлежит самому типу, а не определенному объекту.

Кроме того, здесь есть двойная проверка

 if (_instance == null) { lock (syncLock) { if (_instance == null) 

поскольку из MSDN

Ключевое слово lock гарантирует, что один stream не войдет в критический раздел кода, а другой stream находится в критическом разделе. Если другой stream пытается ввести заблокированный код, он будет ждать, блокировать, пока объект не будет выпущен.

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

Надеюсь, это помогает в очистке больше.

И, пожалуйста, прокомментируйте, если я понимаю, что это неправильно.

Это шаблон дизайна, и это не относится к c #. Подробнее об этом по всему Интернету и так далее, как в этой статье в Википедии .

В разработке программного обеспечения шаблон singleton представляет собой шаблон проектирования, который используется для ограничения экземпляра classа для одного объекта. Это полезно, когда необходим один объект для координации действий в системе. Концепция иногда обобщается на системы, которые работают более эффективно, когда существует только один объект, или которые ограничивают экземпляр определенным количеством объектов (например, пять). Некоторые считают, что это анти-шаблон, судя, что он чрезмерен, вводит ненужные ограничения в ситуациях, когда единственный экземпляр classа фактически не требуется, и вводит глобальное состояние в приложение.

Вы должны использовать его, если хотите class, который может быть установлен только один раз.

Я использую его для данных поиска. Загрузите один раз из БД.

 public sealed class APILookup { private static readonly APILookup _instance = new APILookup(); private Dictionary _lookup; private APILookup() { try { _lookup = Utility.GetLookup(); } catch { } } static APILookup() { } public static APILookup Instance { get { return _instance; } } public Dictionary GetLookup() { return _lookup; } } 

Что такое синглтон:
Это class, который позволяет только создать один экземпляр себя и обычно предоставляет простой доступ к этому экземпляру.

Когда вы должны использовать:
Это зависит от ситуации.

Примечание: пожалуйста, не используйте соединение db. Подробный ответ см. В ответе @Chad Grant

Вот простой пример Singleton :

 public sealed class Singleton { private static readonly Singleton instance = new Singleton(); // Explicit static constructor to tell C# compiler // not to mark type as beforefieldinit static Singleton() { } private Singleton() { } public static Singleton Instance { get { return instance; } } } 

Вы также можете использовать Lazy для создания Singleton .

См. Здесь более подробный пример использования Lazy

Вот что такое синглтон: http://en.wikipedia.org/wiki/Singleton_pattern

Я не знаю C #, но на самом деле это то же самое на всех языках, только реализация отличается.

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

Извините за мой английский 😉

Класс Singleton используется для создания единого экземпляра для всего домена приложения.

 public class Singleton { private static Singleton singletonInstance = CreateSingleton(); private Singleton() { } private static Singleton CreateSingleton() { if (singletonInstance == null) { singletonInstance = new Singleton(); } return singletonInstance; } public static Singleton Instance { get { return singletonInstance; } } } 

В этой статье описывается, как мы можем создать streamобезопасный одноэлементный class с использованием переменной readonly и их практическое использование в приложениях.

Singleton – это тип удаленного объекта, который используется для обслуживания нескольких клиентов. Эти объекты поддерживают состояния, а не типы вызовов типа singel

  • Синглтоны действительно так плохо?
  • Когда сборщик мусора стирает экземпляр объекта, который использует шаблон Singleton?
  • Синглтоны: хороший дизайн или костыль?
  • должно ли соединение db быть одиночным?
  • Необходимость волатильного модификатора в двойной проверенной блокировке в .NET.
  • Singleton через экземпляр JVM или приложения или экземпляр Tomcat
  • Каков эффективный способ реализации одноэлементного шаблона в Java?
  • Зачем использовать синглтон вместо статических методов?
  • Как избежать нескольких экземпляров формы Windows в c #
  • Как создать class singleton
  • Шаблон Singleton в C ++
  • Давайте будем гением компьютера.