1. Obyektin yaradılması
Bax, artıq obyektlərin yaradılmasına gəlib çatdıq. Sən bununla artıq rastlaşmışdın, sadəcə indi bu mövzunu bir az daha detallı müzakirə edəcəyik. Əslində obyekt yaratmaq çox asandır.
Obyekt yaratmaq üçün new operatorundan istifadə etmək lazımdır. Adətən sən yeni bir class nümunəsi (obyekt) yaradırsan və onu həmin tipdə bir dəyişənə saxlayırsan.
Sinif ad = new Sinif(parametrlər);
Burada Sinif — obyektin tipi, ad — dəyişənin adı (adətən kiçik hərflə, məsələn cat), və = sağında isə həmin sinifin yeni obyektinin yaradılmasıdır.
Nümunələr:
| Kod | Qeyd |
|---|---|
|
object tipində obyektin yaradılması |
|
Cat tipində obyektin yaradılması |
|
Parametr ilə StreamReader obyektinin yaradılması |
Çox vaxt proqramçılar dəyişənləri sinifin adı ilə eyni adlandırırlar, sadəcə kiçik hərflə. Yeni başlayan proqramçı üçün belə kod bir az qarışıq görünə bilər:
| Kod |
|---|
|
|
|
Əslində bu kodda heç bir qorxulu şey yoxdur — bu ən adi koddur, burada dəyişən yaradılır və dərhal həmin tipdə obyektlə inisializasiya olunur.
Solda — dəyişənin elan olunması, sağda — new ilə yaddaşda yeni obyektin yaradılması. Hamısı bu qədər!
2. Konstruktor
Yəqin tez-tez görmüsən ki, obyekt yaradanda ona hansısa parametrlər ötürülür. Bəzən obyektə parametrlər ötürülür, bəzən isə yox. Ümumiyyətlə bu parametr mexanizmi necə işləyir?
Burada da hər şey sadədir: hər bir class-da xüsusi metod (və ya metodlar) var ki, obyekt yaradılarkən parametrləri emal edir. Belə metodlara konstruktorlar deyilir. Bir metod isə, müvafiq olaraq, konstruktor adlanır.
Konstruktor metodunu adi metoddandan ayırmaq çətin deyil. Belə metodun iki xüsusiyyəti var:
- konstruktor metodunun adı sinifin adı ilə eyni olur (və böyük hərflə başlayır)
- konstruktor metodu heç bir qaytarılan tipə sahib olmur (hətta void da yazılmır).
Onun ümumi görünüşü adətən belə olur:
modifikatorlar Sinif(parametrlər)
{
konstruktorun kodu
}
Konstruktorun elan olunması nümunəsi:
public class Point
{
public int X;
public int Y;
public Point(int x, int y) // Konstruktor
{
X = x;
Y = y;
}
}
İstifadə:
Point p = new Point(5, 10); // Konstruktorun çağırılması
Obyekt new Point(5, 10) ilə yaradılarkən iki parametrli konstruktor çağırılacaq və X və Y sahələri inisializasiya olunacaq.
Bəzən konstruktorun parametrləri sahələrlə eyni adlara malik olur — rahatlıq üçün. Belə ad konflikti this açar sözü ilə həll olunur:
public Point(int x, int y)
{
this.x = x; // this.x — obyektin sahəsi, x — konstruktorun parametri
this.y = y;
}
3. Konstruktorun çağırılması
Sən new Sinif(parametrlər) yazanda, C#:
- yaddaşda yeni obyekt yaradır,
- sənin parametrlərini ötürərək uyğun konstruktoru çağırır.
Pişik class-ı ilə nümunə:
public class Cat
{
public string Name;
public int Age;
public Cat(string name, int age)
{
Name = name;
Age = age;
}
}
İstifadə:
Cat cat = new Cat("Vaska", 2); // Olar: iki parametrli konstruktor çağırılır
Cat cat2 = new Cat("Vaska"); // Olmaz: belə konstruktor yoxdur — kompilasiya xətası
Cat cat3 = new Cat(); // Olmaz: parametrsiz konstruktor yoxdur — kompilasiya xətası
Əgər class-da yalnız parametrli konstruktor varsa, obyekt yaradanda mütləq həmin parametrləri ötürməlisən.
4. Bir neçə konstruktor
Amma əgər sənə lazımdırsa, class-a bir neçə konstruktor əlavə edə bilərsən. Konstruktorların və onların parametrlərinin sayı üçün heç bir məhdudiyyət yoxdur. Obyekt yaradanda kompilator özü parametrlərə uyğun konstruktoru seçəcək.
Nümunə:
public class Cat
{
public const int UNKNOWN = -1;
public string Name;
public int Age;
public Cat(string name, int age)
{
Name = name;
Age = age;
}
public Cat(string name)
{
Name = name;
Age = UNKNOWN; // Naməlum yaş üçün "default" dəyər
}
}
İstifadə:
Cat cat1 = new Cat("Vaska", 2); // Birinci konstruktor istifadə olunur
Cat cat2 = new Cat("Murka"); // İkinci konstruktor istifadə olunur
Cat cat3 = new Cat(); // Xəta! Parametrsiz konstruktor yoxdur
Biz qərara gəldik ki, pişiyin yaşı naməlum ola bilər. Bu halda koda xüsusi bir sabit — UNKNOWN əlavə etdik və yalnız ad qəbul edən konstruktor yazdıq.
Diqqət et ki, hər iki konstruktorun içində də class dəyişənlərini inisializasiya edirik. Naməlum/olmayan parametrləri UNKNOWN sabiti ilə əvəz edirik.
5. Default konstruktor
Əgər class-da heç bir konstruktor yoxdursa, kompilator avtomatik olaraq parametrsiz boş konstruktor əlavə edəcək:
public ClassName()
{
}
Amma class-da artıq ən azı bir konstruktor varsa — avtomatik olaraq boş konstruktor artıq əlavə olunmur.
Nümunə 1:
public class Cat
{
public string Name;
public int Age;
}
// Olar:
Cat cat = new Cat(); // Default konstruktor (parametrsiz) çağırılacaq
Nümunə 2:
public class Cat
{
public string Name;
public int Age;
public Cat(string name) { Name = name; }
}
// Olmaz:
Cat cat = new Cat(); // Xəta: parametrsiz konstruktor artıq yoxdur!
6. Dəyişənlərin inisializasiyası
C#-da class dəyişənlərini ya birbaşa elan zamanı, ya da konstruktorun içində inisializasiya etmək olar.
Nümunə:
public class Cat
{
public string Name;
public int Age = -1; // Başlanğıc dəyər
public Cat(string name, int age)
{
Name = name;
Age = age; // Başlanğıc dəyəri yenidən yazır
}
public Cat()
{
Name = "Adsız";
// Age -1 olaraq qalır (başlanğıc dəyər)
}
}
İzah:
- new Cat("Vaska", 2) ilə yaradanda Age əvvəlcə -1 olacaq, amma konstruktor ona 2 verəcək.
- new Cat() ilə yaradanda isə Age -1 olaraq qalacaq.
7. Dəyişənlərin inisializasiya qaydası
Yeni obyektin məlumatları belə ardıcıllıqla inisializasiya olunur:
- Class sahələri əvvəlcə default dəyərlər alır (0 üçün int, null üçün referans tiplər və s.).
- Sonra sahələrin elanında yazdığın inisializatorlar, kodda göründüyü ardıcıllıqla işləyir.
- Və yalnız bundan sonra konstruktorun kodu işləyir.
Dəyişənlər konstruktordan əvvəl və elan olunduğu ardıcıllıqla inisializasiya olunur. Ona görə sahələr arasındakı asılılıqlara diqqət et.
Səhv nümunə
Qeyri-statik sahələri qeyri-statik dəyişənlərlə inisializasiya etmək olmaz:
public class Solution
{
public int a = 1;
public int b = a; // a istifadə etmək olmaz
public int c = a + b; // a və b istifadə etmək olmaz
}
// Belə kod kompilasiya xətası verəcək!
Düzgün nümunə
Statik dəyişənlər üçün hər şey işləyəcək:
public class Solution
{
public static int a = 1; // a = 1 açıq şəkildə verilir
public static int b = a + 2; // b = 1 + 2 ⇒ 3
public static int c = a + b + 3; // c = 1 + 3 + 3 ⇒ 7
public Solution()
{
Console.WriteLine($"a = {a}, b = {b}, c = {c}");
// Çap edəcək: a = 1, b = 3, c = 7 — məhz gözlənilən kimi
}
}
Düzgün nümunə 2
Statik sahələr üçün hətta belə də yazmaq olar:
public class Solution
{
public static int a = b + c + 1; // b və c hələ 0-dır
public static int b = a + c + 2; // a == 1, c hələ 0-dır
public static int c = a + b + 3; // a == 1, b == 3
}
GO TO FULL VERSION