Как вернуть статический экземпляр класса в C#

Я хотел бы получить экземпляр статического класса, но я не могу этого сделать без реализации одноэлементной оболочки для нестатического класса– возможно ли это, или я что-то упускаю?

public class MyInstanceTester
 {
    public MyInstanceTester()
    {
        //this is how i get a reference to a singleton now
        MyClass instance1 = MyClass.Instance();
        //this is what is would like to do (if only the compiler would let me)
        MyStaticClass instance2 = MyStaticClass.Instance();
    }
}


public class MyClass
{
    private static MyClass _myInstance;

    static MyClass()
    {
        _myInstance = new MyClass();
    }


    public static MyClass Instance()
    {
        return _myInstance;
    }

}

public static class MyStaticClass
{
    public static MyStaticClass Instance
    {
        get
        {
            return this;
        }
    }
}

5 ответов


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

вы можете быть смущены:

private static MyClass _myInstance;

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

несколько замечаний:

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

читайте далее: Джон Скит имеет отличную по реализации Синглеты в C# в глубину. Я бы предложил читать и изучать эту статью, Пока вы не Грок его. Это очень хорошо.


нет причин возвращать instance to a static class (если класс статический, то экземпляра нет ).

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

использование статического класса

использовать статический класс, просто напишите его, как показано ниже:

MyStaticClass.MyMethod();
Int32 callCount = MyStaticClass.CallCount;

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

MyStaticClass msc = MyStaticClass.Instance();
msc.MyMethod();
Int32 callCount = msc.CallCount;

если вы хотите иметь более короткое имя, которое вы просто можете использовать:

 using MSC = MyNamespace.MyStaticClass;

из ваших комментариев я предполагаю, что ваше решение будет:

сделайте свой класс нестатическим. (Просто держите методы статическими.)


ваша терминология неправильная. Ознакомьтесь, пожалуйста статья MSDN о ключевом слове static.

на статический элемент нельзя ссылаться через экземпляр. Вместо этого ссылается через имя типа.

на синглтон - это класс, который позволяет только один экземпляр. Общее внедрение этого в C# - это:

public class MyClass
{
    private MyClass _value = null;

    public MyClass Value {
        get { return _value ?? (_value = new MyClass()); }
    }
}

основная проблема здесь:

public static class MyStaticClass 
{     
    public static MyStaticClass Instance
    {         
         get
             {             
                  return this; //compile time error!
             }
    }
}

this относится к экземпляру класса, который не имеет смысла в статическом классе, поскольку не может быть экземпляра одного. Это само по себе должно заставить вас понять, что в том, что вы спрашиваете, есть фундаментальная ошибка: "Я хотел бы получить экземпляр статического класса". Вы не можете вернуть экземпляр статического класса, поскольку статический класс по определению не может быть создан.

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