Да си припомним: какво са класовете и обектите?


Последователност на инициализиране на полетата на класа



страница24/84
Дата03.01.2022
Размер0.54 Mb.
#112941
ТипПрограма
1   ...   20   21   22   23   24   25   26   27   ...   84
Класове
Свързани:
Изпитна тема1, Изпитна тема2
Последователност на инициализиране на полетата на класа

За да няма обърквания, нека разясним последователността, в която се инициализират полетата на един клас, независимо от това дали сме им дали стойност по време на декларация и/или сме ги инициализирали в конструктора.

Първо се заделя памет за съответното поле в хийпа и тази памет се ини­циализира със стойността по подразбиране на типа на полето. Напри­мер, нека разгледаме отново нашия клас Dog:

public class Dog

{

private string name;



 

public Dog()

{

Console.WriteLine(



"this.name has value of: \"" + this.name + "\"");

// ... No other code here ...

}

// ... Rest of the class body ...



}

При опит да създадем нов обект от тип нашия клас, в конзолата ще бъде отпечатано съответно:

this.name has value of: ""

Втората стъпка на CLR, след инициализирането на полетата със стой­ността по подразбиране за съответния тип е, ако е зада­дена стойност при декларацията на полето, тя да му се присвои.

Така, ако променим реда от класа Dog, на който декларираме полето name, то първоначално ще бъде инициализирано със стойност null и след това ще му бъде присвоена стойността "Rex".



private string name = "Rex";

Съответно, при всяко създаване на обект от нашия клас:

public static void Main()

{

Dog dog = new Dog();



}

Ще бъде извеждано:

this.name has value of: "Rex"

Едва след тези две стъпки на инициализация на полетата на класа (ини­циализиране със стойностите по подразбиране и евентуално стойността зададена от програмиста по време на декларация на полето), се извиква конструкторът на класа. Едва тогава, полетата получават стойностите, с които са им дадени в тялото на конструктора.

Деклариране на конструктор с параметри

В предната секция, видяхме как можем да дадем стойности на полетата, различни от стойностите по подразбиране. Много често, обаче, по време на декларирането на конструктора не знаем какви стойности ще приемат различните полета. За да се справим с този проблем, по подобие на методите с параметри, нужната информация, която трябва за работата на конструктора, му се подава чрез списъка с параметри. Например:

public Dog(string dogName, int dogAge, double dogLength)

{

name = dogName;



age = dogAge;

length = dogLength;

collar = new Collar();

}


Съответно, извикването на конструктор с параметри, става по същия начин както извикването на метод с параметри – нужните стойности ги подаваме в списък, чийто елементи са разделени със запетайки:

public static void Main()

{

Dog myDog = new Dog("Bobi", 2, 0.4); // Passing parameters



 

Console.WriteLine("My dog " + myDog.name +

" is " + myDog.age + " year(s) old. " +

" and it has length: " + myDog.length + " m.");

}


Резултатът от изпълнението на този Main() метод е следния:

My dog Bobi is 2 year(s) old. It has length: 0.4 m.

В C# нямаме ограничение за броя на конструкторите, които можем да създадем. Единственото условие е те да се различават по сигнатурата си (какво е сигнатура обяснихме в главата "Методи").



Сподели с приятели:
1   ...   20   21   22   23   24   25   26   27   ...   84




©obuch.info 2024
отнасят до администрацията

    Начална страница