nishuthegreat Ответов: 3

Сомнений в статических и статических конструкторов в C#


У меня есть сомнения в статическом и нестатическом конструкторе;

пожалуйста внимательно смотрите следующий пример здесь я объявляю статический и нестатический конструктор и получаю доступ к статическим и нестатическим членам из него

class SampleConstructor
   {
        public static int s;
        public int ns;

        //creating a static constructor
        static SampleConstructor()
        {
            s = 23;

        }

        //Creating a non static constructor

        public SampleConstructor()
        {
           // s = 45;
            ns = 33;
        }

    }
    class UseSampleConstructor
    {
        static void Main(string[] args)
        {
            SampleConstructor sc = new SampleConstructor();
            Console.WriteLine("{0},{1}" ,sc.ns,SampleConstructor.s);
            Console.ReadKey();
        }
    }


------------------------------------------------------------------------
результат приведенного выше примера составляет 33,23

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


class SampleConstructor
    {
        public static int s;
        public int ns;

        //creating a static constructor
        static SampleConstructor()
        {
            s = 23;

        }

        //Creating a non static constructor

        public SampleConstructor()
        {   
            //here I am initializing static member also
            s = 45;
            ns = 33;
        }

    }
    class UseSampleConstructor
    {
        static void Main(string[] args)
        {
            SampleConstructor sc = new SampleConstructor();
            Console.WriteLine("{0},{1}" ,sc.ns,SampleConstructor.s);
            Console.ReadKey();
        }
    }


теперь в этом случае я получаю выход как 33,45

почему??? несмотря на то, что я все еще обращаюсь к SampleConstructor.s, который является статическим, является членом статического конструктора

кто-нибудь может пожалуйста помочь мне??

3 Ответов

Рейтинг:
27

CPallini

Из документации (MSDN [^]):

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


Вызывается конструктор вашего экземпляра (т. е. нестатический) после статический элемент и, следовательно, он изменяет содержимое статического элемента.
:)


[no name]

От ОП: спасибо Паллини и Наваниту за то, что они развеяли мои сомнения

Рейтинг:
2

Sajid Ahmed Shahsroha

Статические члены могут быть вызваны только с именем класса,изначально ваш " s "инициализируется статическим конструктором,но когда вы вызываете нестатический конструктор в основном методе, ваше значение" s " заменяется нестатическим конструктором

Статический конструктор инициализирует только статические переменные но нестатический конструктор может инициализировать как статические так и нестатические переменные


Рейтинг:
17

N a v a n e e t h

писал:
несмотря на то, что я все еще обращаюсь к SampleConstructor.s, который является статическим, является членом статического конструктора


Он не является членом статического конструктора. Это член типа SampleConstructor.

писал:
теперь в этом случае я получаю выход как 33,45

почему???


сначала выполняется статический конструктор, который установит s = 23 а затем запустится конструктор экземпляра, который перепишет значение на 45.


[no name]

От ОП: спасибо Паллини и Наваниту за то, что они развеяли мои сомнения