Gaurav_Chaudhary Ответов: 3

Не могли бы вы дать мне знать, что делает частный статический конструктор?


Всем привет,

Просто наткнулся на код планировщика, имеющий класс с частным статическим конструктором

internal class DBCache
    {
        private static DBCache objDBCache = new DBCache();
        private DataSet dsFieldDetails = new DataSet();

        bool isCached = false;......}


Я не уверен, почему конструктор объявлен частным и статическим.

Любые идеи! Очень ценю

Спасибо!

Что я уже пробовал:

Just came across a scheduler code having a class with private static constructor

3 Ответов

Рейтинг:
21

Midi_Mick

Статический конструктор используется для инициализации статических элементов объекта. Он вызывается один раз и только один раз, когда к какому-либо статическому методу или свойству обращается тип.

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


Рейтинг:
20

CPallini

Это не так. private static constructor (AFAIK не существует в C#) но а private static member variable проведение экземпляра DBCache класс).
Его можно было бы использовать, например, для реализации Singleton шаблон.


Рейтинг:
11

F-ES Sitecore

Это не конструктор, это просто переменная-член. Тот факт, что он является частным, означает, что только код внутри DBCache может получить к нему доступ, поэтому код вне calss не может получить к нему доступ таким образом;

DBCache.objDBCache

Эта строка гарантирует, что при первом использовании типа DBCache переменная objDBCache будет иметь новый объект DBCache, а это означает, что каждый раз, когда используется DBCache, гарантируется, что objDBCache ссылается на объект. Тот факт, что эта переменная статична, также означает, что когда-либо будет только один из них, так что это похоже на синглтон.

Рассмотрим код ниже

public class TestClass
{
    private static DateTime dt = DateTime.Now;

    public void DoSomething()
    {
        Console.WriteLine(dt);
    }

    public static void DoSomethingElse()
    {
        Console.WriteLine(dt);
    }
}

static void Main(string[] args)
{
    TestClass tc = new TestClass(); // this is the first time the TestClass type is loaded into this application domain so dt will
                                    // be given a value

    tc.DoSomething(); // this will output dt
    TestClass.DoSomethingElse(); // this will output the same value for dt

    TestClass tc2 = new TestClass(); // we are creating a new instance of TestClass but TestClass already exists in the domain so
                                     // dt will not be updated as that only happens when TestClass is first used

    tc2.DoSomething(); // this will output the same value for dt despite being a different instance
}


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