Как получить доступ к статическому методу класса Singleton? - PullRequest
2 голосов
/ 17 ноября 2010

У меня некоторая путаница с одноэлементным классом, ниже приведены некоторые мои замечания:

  1. Может ли одноэлементный класс иметь статический метод?, Если да, то как мы называем эти методы?
  2. чтоявляется основным отличием между классом Static и классом Singleton?

Я создал свой класс Singleton следующим образом:

 public class Singleton
    {
        private static  Singleton _instance = null;
        private static object chekLock = new object();
        private Singleton()
        {}

        public static Singleton Instance
        {
            get
            {
                lock (chekLock)
                {
                    if (_instance == null)
                        _instance = new Singleton();
                    return _instance;
                }
            }
        }

        public static void StaticAddMethod()
        {
            Console.WriteLine("Add Method");
        }

        public void AddMethod()
        {
            Console.WriteLine("Add Method");
        }
    }

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

Как я могу использовать статический метод синглтон-класса?

Ответы [ 7 ]

6 голосов
/ 17 ноября 2010

Как вы пытаетесь получить к нему доступ? Для доступа к статическому методу вы используете имя типа:

Singleton.StaticAddMethod();

против

Singleton.Instance.AddMethod();

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

Re разница между синглтоном и статическим; Синглтон может реализовывать интерфейс, позволяя передавать его в существующий код. Вы также можете (как на самом деле делаете) отложить создание синглтона (но все же разрешить доступ к статическим методам, которые не включают экземпляр синглтона). Но да: между статикой и синглтоном много пересечений.

2 голосов
/ 17 ноября 2010

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

Итак

Singleton.StaticAddMethod();

Будет работать

Также измените ваше объявление с

private static  Singleton _instance = null;

на

private static READONLY  Singleton _instance = new Singelton();

Это позволит вам избавиться от всех блокировок, которые вы делаете, поскольку readonly может быть назначен только при создании, защищая вас от любой блокировки, с которой вы можете столкнуться;)

public static Singleton Instance        
{            
    get
    {
        return _instance;
    }
}
2 голосов
/ 17 ноября 2010

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

Singleton.StaticAddMethod()
2 голосов
/ 17 ноября 2010

Вы должны получить доступ к статическому методу через:

Singleton.StaticAddMethod()

Или, если вы уже внутри Singleton, то просто:

StaticAddMethod()

Разница в том, что статический метод доступен из любого места. Метод экземпляра требует, чтобы вы вызвали метод для созданного экземпляра вашего класса. Что касается Singleton, это означает, что класс имеет экземпляр поля / методы, но вы можете получить доступ к единственному экземпляру через статическое свойство Instance.

1 голос
/ 17 ноября 2010

Как это:

Singleton.StaticAddMethod();

Singleton.Instance.AddMethod();
0 голосов
/ 24 января 2011

Вот пример того, как получить доступ к членам класса Singleton, который является поточно-ориентированным, и как кодировать этот класс.

http://www.helplessautomation.com/2011/01/creating-a-singleton-in-c-instance-class/

El Matador

0 голосов
/ 17 ноября 2010

К вашему второму вопросу, одно из различий между ними состоит в том, что одноэлементный класс может быть вложен в подклассы и участвовать в полиморфном поведении так, как статический класс не может.

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