Mənim bloqum

Konstruktor Nədir?

C# proqramlaşdırma dilində sinif obyektlərinin yaradıldığı ana nəzarət etmək və obyekt yaradılarkən müəyyən ilkin dəyərləri təyin etmək üçün istifadə olunan xüsusi üsul "Constructor" adlanır. Constructor obyekt yaradılanda ilk çağırılan, class-la eyni ada sahib spesifik metod-dur.


Təyin Edilməsi

Bilməli olduğumuz vacib məqamlardan biri də biz manual şəkildə Constructor-u yaratmasaq da Compiller arxa planda class-dan instance alındığı anda avtomatik Classla eyn adlı, parametrsiz default Constructor təyin edir və onu işə salır. Bu, obyekt üçün Ram-da yer ayrıldıqdan dərhal sonra baş verir. Biz custom şəkildə yazdıqda isə defual Constructor-u əzib yenidən özümüz onu təyin etmiş oluruq. Bundan sonra sistemin özünün arxa planda təyin etdiyi default konstruktorla sağollaşırıq. O, artıq yoxdur. Bizim yaratdığımız və hətta yaratdıqlarımız var.

image

Constructor Overloading

Class-ın nümunəsi(instance) yaradılanda bu konstruktor avtomatik olaraq işə düşür. Bir class-da birdən çox konstruktor müəyyən edilə bilər. Bu, "Constructor overloading" adlanır. Konstruktorun həddən artıq yüklənməsi, müxtəlif parametrlərlə çoxsaylı konstruktorlar təyin edərək eyni sinif daxilindəki müxtəlif formalarının, versiyalarının yaradılmasıdır. Bu, class-ı müxtəlif kontekstlərə və ehtiyaclara uyğun yaratmağa imkan verir. Constructor özü də xüsusi class member-i olmaqla yaradıcı metoddur. Aşağıdakı nümunədə biz MyClass adlı bir class təyin edirik. Bu class-da iki konstruktor var: biri parametrsiz (standart konstruktor), digəri isə parametrli. Default Constructor (Parametrsiz): Bu konstruktor heç bir parametr qəbul etməyən strukturdur və class obyektləri yaradıldıqda arxa planda avtomatik olaraq çağırılır. Birinci nümunədən göründüyü kimi, MyClass() formasında yaradılır. Parametr qəbul edən konstruktor: Bu konstruktor bir və ya bir neçə parametr qəbul edə bilər və instance yaradılan zaman bu parametrlərlə çağırılır. İkinci misal konstruktorun MyClass(int parametr1, string parametr2) parametr qəbul etdiyini göstərir.

                        
                                                                                                                                
public class MyClass
{
    // Parametrsiz konstruktor
    public MyClass()
    {
        // Constructor kodu
    }

    // Bir parametr alan konstruktor
    public MyClass(int parameter1)
    {
        // Constructor kodu
    }

    // İki parametr alan konstruktor
    public MyClass(int parameter1, string parameter2)
    {
        // Constructor kodu
    }
}

                                                     
                                                     
                                                                             
                                                                            

Niyə İstifadə Etməliyik?

Class-ın obyekti yaradıldığı anda obyekti özəlləşdirilmiş konfiqurasiyalarla təyin edə bilməyimiz üçün əlavə funksiya yaratmaqdansa bunu elə defualt yaranan Constructor metod ilə edə bilərik. Təbii ki, class member-lərinin ilk dəyərlərinin bu üsulla təyin edilmə məcburiyyəti yoxdur. Sadəcə bu da bir həlldir. Constructor, bu metod-un çağırılaraq obyekt yaradılması prosesidir.

                        
                                                                                                                                                                                
 new MyClass();

                                                     
                                                     
                                                     
                                                                             
                                                                            

İlkin dəyərlərin verilməsi

Obyek yaradılarkən class member-lərinə ilk dəyərləri aşağıdakı formada contructor vasitəsi ilə təyin edə bilərik.

                        
                                                                                                                                                                                
public class Person
{
    int _id;
    string _name;
    string _email;

    public Person()
    {
        _id = 1;
        _name = "Khanim";
        _email = string.Empty;
    }
}


namespace Blogs.Blog_1
{
    public class Progam
    {
        public static void Main(string[] args)
        {
            Person person = new();
        }
    }
}

                                                     
                                                     
                                                     
                                                                             
                                                                            

Class-a Konstruktordan Dəyər Göndərilməsi

Class member-lərinə dəyərləri Consctructor vasitəsi ilə göndərə bilərik. Bu zaman Compiler hansı overloading-in çalışması ilə bağlı qərarı da məhz göndərdiyimiz dəyərlərə əsasən verir. Bunun üçün aşağıdakı nümunəyə nəzər yetirək. Bizim göndərdiyimiz dəyərlərə əsasən Constructor-un ikinci overloading-i işə düşərək name və email dəyərlərini assign edir. _id field-ə birinci(parametrsiz) overload çalışmadığından heç bir dəyər assign olunmur. Standart qaydada sadəcə bir overload çalışacaq. Demək bir class-ın neçə overload-ı olursa olsun sadəcə biri, bizə lazım olanı işə düşəcək.

                        
                                                                                                                                                                                
public class Person
{
    int _id;
    string _name;
    string _email;

    public Person()
    {
        _id = 99999999;
    }

    public Person(string name, string email)
    {
        _name = name;
        _email = email;
    }
}

Person person = new("khanim","info@khanimgurbanli.com");
                                                     
                                                     
                                                     
                                                                             
                                                                            

Static Constructor

C# dilində "Static Constructor" sinfin yalnız bir dəfə işə düşdüyü və "statik üzvlərin" işə salındığı xüsusi bir növdür. Statik konstruktor sinifdən ilk dəfə istifadə edildikdə avtomatik olaraq çağırılır və sinfin nümunəsi "yaradılmazdan əvvəl" işləyir. Statik konstruktorlar aşağıdakı xüsusiyyətlərə malikdir: Bir sinifdə yalnız bir statik konstruktor ola bilər. Bu konstruktor sinif daxilində müəyyən edilməlidir və parametrləri qəbul edə bilməz. Statik konstruktorlar parametr qəbul etmir və sinfin digər konstruktorlarından fərqli olaraq new açar sözü ilə çağırıla bilməz. Statik konstruktor digər instansiya konstruktorlarından asılı olmayaraq işləyir. Buna görə də, sinfin nümunələri yaradılmazdan əvvəl yalnız bir dəfə işə salınır.

                        
                                                                                                                                                                                
public class MyClass
{
    // Statik bir property
    public static int StaticField { get; set; }

    // Static constructor
    static MyClass()
    {
        // Statik constructor kodu
        StaticField = 42;
        Console.WriteLine("Static Constructor!");
    }

    // Diğər constructor-lar ve metotlar burada.
}

class Program
{
    static void Main()
    {
        // Class-ən static constructor-u burada avtomatik olaraq çağrılır.
        int value = MyClass.StaticField; 
    }
}
                                                     
                                                     
                                                     
                                                                             
                                                                            

Metodla Oxşar Xüsusiyyətləri

Adı: Həm konstruktorların, həm də normal metodların adı olmalıdır. Bununla belə, konstruktorlar siniflə eyni ada malik olsalar da, normal metodların fərqli adları ola bilər. Parametr qəbul etməsi: Həm konstruktorlar, həm də normal metodlar parametr qəbul edə bilər. Bu parametrlər metodun funksiyasını və necə işlədiyini müəyyən etmək üçün istifadə olunur. Kod Bloku: Həm konstruktorlar, həm də normal metodlar tapşırıqları yerinə yetirən kodları ehtiva edir. Çağırılması: Həm konstruktorlar, həm də normal metodlar digər kod blokları daxilində çağırıla və istifadə edilə bilər. Həddindən artıq yükləmə strukturu: Adi metodlar kimi konstruktorlar da həddən artıq yüklənməni dəstəkləyir və çoxlu konstruktorlar müxtəlif parametr siyahıları ilə müəyyən edilə bilər.


Metodla Fərqli Xüsusiyyətləri

Return type: Əsas fərqlərdən biri konstruktorların return type-a malik olmamasıdır. Normal metodlarda bu, void belə olsa mütləq return type təyin edilməlidir. Çağırılma: Konstruktorlar bir sinif nümunəsi yaradıldıqda avtomatik olaraq çağırılır. Normal metodlar-ın işə düşməsi üçün açıq şəkildə çağırılması şərtdir.


Xüsusi Qeydlər

- Constructor yaradıcı metoddur - Bir class içərisində Constructor xaric onunla eyni adlı metod və ya digər hər hansı member təyin edilə bilməz, Compiler xəta verər. - Constructor geriyə dəyər qaytarmır. Diqqətli olaq, sadəcə dəyər qaytarmır yəni "void" ilə işarə edə bilərik demirəm. Ümumən, geriyə dəyər qaytarmadığı üçün Compiler "void" də daxil olmaqla "return type" təyin etməyimizə icazə vermir. - Class-dan kənarda həmin class-dan obyekt yarada bilməyimiz üçün bu constructor public access modifier ilə işarə olunmalıdır. - Constructor metod olmadan, obyekt yaradılmaz - Class adından fərqli adla qeyd etməyimizə Compiler icazə vermir. - Class-dan obyekt yaratdığımızda normal Constructor-dan da öncə sadəcə bir dəfə olmaqla həmin class-ın Static Constructor-u işə düşür - Static Constructor sadəcə bir dənə olur və onunla overloading mümkün deyil - Static olmayan class-ın da mütləq Static Constructor-u olur - Constructor overloading-dakı qaydalar tamamilə Metod overloading-dəki kimidir - Constructor daha dəqiq desək obyekt üçün yaddaşda yer ayrılandan sonrakı mərhələdə çağrılır və ya işə düşür