Вопрос по c# – Как вернуть экземпляр статического класса в C #

7

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

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;
        }
    }
}
Я не думаю, что вы можете получить экземпляр статического класса. Я думаю, что это точка статического класса. Это не? General Grey
@AloisKraus переменнаяthis не существует в этом контексте, потому что его всегда первый аргумент метода и первый аргумент статического метода используются для «пользовательских» аргументов. Felix K.
Да, вы что-то упускаете. & Quot; это & Quot; не имеет смысла в статическом методе. Или, говоря другими словами: «это» пустая ссылка в статических методах. Компилятор по праву избавляет вас от попыток вернуть нулевые ссылки. Alois Kraus
Метод get экземпляра MyStaticClass является статическим, где он пытается вернуть это. Это не будет работать. Компилятор пожалуется на это. Alois Kraus

Ваш Ответ

5   ответов
2

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

статические методы могут вызываться только по имени класса, а вы не можете вызывать их по имени объекта
3

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

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

Static class usage

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

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

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

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

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

 using MSC = MyNamespace.MyStaticClass;
@PeteN Как упоминалось выше, вы просто не можете вернуть ссылку на ваш статический класс, единственный способ архивировать это - сделать его одиночным. Может быть, вы могли бы обновить свой ответ с дополнительной информацией для других читателей.
Привет @ Felix-K причина этого в том, что я реализую интерфейс, который возвращает объект, я хочу, чтобы этот объект был ссылкой на существующий статический служебный класс, который у меня есть:public object InerfaceProperty { get { return MyStaticUtilityClass.Instance ; } } PeteN
Привет @ felix-k, не уверен, что вы понимаете, почти, хотя интерфейс не мой, от третьей стороны, я не имею над ним контроля, он реализуется в нестатическом классе, но одно из свойств интерфейса возвращает объект, я хочу, чтобы он возвращал ссылку на мой статический служебный класс (чтобы представить его методы шаблону NVelocity) - так что немного другой сценарий, хотя я думаю, что ответ тот же :) PeteN
@PeteN Если я правильно понимаю, это мой ответ: вы не можете реализовать интерфейс для статического типа, поэтому используйте шаблон singletone для архивирования того, что вам нужно.
13

сто возвращает один и тот же экземпляр класса для повторных запросов.

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

private static MyClass _myInstance;

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

Несколько заметок:

The this keyword is not valid in a static member If you have a static class then all members have to be static and so this will never be valid A Singleton class cannot be a static class Singletons declare a single static member to help ensure that only a single instance of that class exists Note that a static reference to an object does not make the object static. Only the reference is static

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

ХОРОШО. Статический класс не может реализовать интерфейс. Это не разрешено. Таким образом, шаблон синглтона в порядке здесь. В чем проблема с вашим первым примером?MyClass instance1 = MyClass.Instance();
в этом заключается проблема, я не могу получить к нему доступ напрямую, я должен реализовать этот интерфейсIScriptedContentFragmentExtension передать мой объектNVelocity шаблон (аналогично бритве) в качестве ссылки на объект, затем методы вызываются из объекта в шаблоне NVelocity. PeteN
спасибо, вы отлично ответили на первую часть моего вопроса: "Нет такой вещи, как экземпляр статического класса". Но чтобы добавить больше контекста (см. Мои комментарии к ответу @ felix-k). Что я пытаюсь достичь: у меня есть несколько статических методов в статическом классе, я хочу вернуть ссылку на них как на объект - каков наилучший способ сделать это? PeteN
Если у вас есть статический класс, вы ссылаетесь на него напрямую. Ссылки на статические классы на самом деле не возвращаются, к ним обращаются напрямую. Я думаю, что все, что вы действительно ищете, это статический класс. Забудьте шаблон Singleton и используйте статический класс следующим образом:var result = MyStaticClass.SomeStaticFunction();
у меня нет проблем с моим оригинальным MyClassinstance1 = MyClass.Instance() Решение, я просто подумал, что я мог пропустить трюк, и был простой способ получить ссылку на статический класс. Ясно, что это не так, как вы указали "Нет такого понятия, как экземпляр статического класса", спасибо за ввод PeteN
0

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

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

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

0

Статья MSDN о статическом ключевом слове.

A static member cannot be referenced through an instance. Instead, it is referenced through the type name.

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

public class MyClass
{
    private MyClass _value = null;

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

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