Страницы

Поиск по вопросам

пятница, 20 декабря 2019 г.

Конструктор классов

#c_sharp #net


Например есть такой класс(к примеру)  

 public class Person
    {
        public int Age { get; set; }
        public string Name { get; set; }

        public Person()
        {
            Age = 10;
            Name = "Nick";
        }
    }  


Вот мне что интересно я когда начал изучать программирование мне говорили что для
конструктора класса не используется понятие возвращаемый тип,по той причине что конструктор
работает всякий раз когда создается объект этого класса и поскольку тип объекта эта
тип класса тогда нету смысла для конструктора написать тип возвращаемого значения(или
я что не так понял?),и мне это не так и интересовал и я не стал искать ответов.
Но не давно начал изучать книгу Рихтера(CLR via C#) и при просмотре IL кода увидел
вот такое  

.method public hidebysig specialname rtspecialname 
    instance void  .ctor() cil managed
{
  // Code size       8 (0x8)
  .maxstack  8
  IL_0000:  ldarg.0
  IL_0001:  call       instance void [mscorlib]System.Object::.ctor()
  IL_0006:  nop
  IL_0007:  ret
} // end of method Program::.ctor  


Если я не ошибаюсь эта "instance void"  часть значит что у конструктора привязан
возвращаемый тип void.
Как это объяснить?  
    


Ответы

Ответ 1



Возвращаемый тип void, это разве не отсутсвие возвращаемого значения? Конструктор в .NET вызывается как метод класса. В вашем примере выше вызывается базовый конструктор типа System.Object: ldarg.0 Загружается первый аргумент метода в стек. Все нестатические методы неявно имеют первый параметр - указатель на экземпляр объекта call instance void [mscorlib]System.Object::.ctor() Вызывает контруктор System.Object на экземпляре вашего класса. Как аргумент передан указатель на экземпляр вашего класса.

Ответ 2



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

Комментариев нет:

Отправить комментарий