CodeGym /Kurslar /C# SELF /Konstruktorlar və obyektin inicializasiyası

Konstruktorlar və obyektin inicializasiyası

C# SELF
Səviyyə , Dərs
Mövcuddur

1. Sadə konstruktorlar

Konstruktor — bu, class-ın xüsusi bir metodudur, hansı ki, obyekt yaradılan kimi avtomatik çağırılır. O, obyekti inicializasiya edir (qurur): ilkin dəyərlər verir, yoxlamalar aparır, hətta içində zarafat yazsan, əhvalını da qaldıra bilər.

Konstruktor sənə imkan verir ki, obyekti dərhal müəyyən vəziyyətdə yaradasan, bütün datanı ayrıca field və property-lərlə əl ilə verməyəsən. Bu rahat və təhlükəsizdir, çünki vacib parametrləri dərhal göstərirsən — və nəyisə kritik dərəcədə vacib olanı unutmayacaqsan.

Konstruktorsuz kod bir az həcmli və səhvlərə açıq ola bilər:

Person p = new Person();
p.Name = "Yulya";
p.Age = 25; // Bəs yaşı göstərməyi unutsaq?

Konstruktorla:


Person p = new Person("Yulya", 25); // Hər şey dərhal verildi və obyekt yaşamağa hazırdır!

Konstruktorun sintaksisi

Konstruktor — bu, xüsusi bir "metod"dur, adı class-ın adı ilə tam üst-üstə düşür və heç bir return type-ı yoxdur (hətta void belə deyil). Default konstruktor belə görünür:


public class Person
{
    // Default konstruktor (parametrsiz)
    public Person()
    {
        // Burada inicializasiya kodunu yaza bilərsən
    }
}
Default konstruktor

Default konstruktor — bu, görünməyən bir "köməkçi"dir, heç bir parametr qəbul etmir və sadəcə class-ın bütün field və property-lərini default dəyərlərlə inicializasiya edir:

  • Rəqəm tipləri üçün (int, double, float və s.) bu 0 olacaq.
  • Boolean üçün (bool) bu false olacaq.
  • Reference tiplər üçün (string, başqa class-lar) bu null olacaq (yəni "heç nə", "obyektə referans yoxdur").
  • DateTime üçün isə 01.01.0001 00:00:00 olacaq.

Konstruktoru necə çağırmaq olar?

Əslində, obyekt yaradanda new operatorunu yazanda sən konstruktoru çağırırsan!

Person p = new Person();

Əgər sən heç bir konstruktor təyin etmirsənsə, C# compiler-i sənin üçün default konstruktor (parametrsiz) yaradacaq. Amma özün ən azı bir konstruktor yazsan — default konstruktor yox olacaq və compiler səndən onu əl ilə əlavə etməyi istəyəcək, əgər lazımdırsa.

Nümunə

Gəlin, tətbiqimizin class-ına konstruktor əlavə edək. Budur, student class-ının sadə versiyası:


public class Student
{
    public string Name;
    public int Age;

    // İki parametrli konstruktor (ad və yaş)
    public Student(string name, int age)
    {
        Name = name; // Field-ə dəyər veririk
        Age = age;
    }
}

İndi student belə yaradıla bilər:

Student s = new Student("İvan", 21);
Console.WriteLine($"{s.Name}: {s.Age} yaş"); // İvan: 21 yaş
  • Konstruktoru class-ın özü kimi public access modifier-i ilə elan etdik.
  • Konstruktor daxilində field-lərə parametrdən gələn dəyərləri veririk.
  • Bu yanaşma unutqanlıqdan qoruyur: compiler səndən obyekt yaradanda ad və yaş istiyəcək.

2. Konstruktorun parametrləri

C#-da bir neçə konstruktor elan etmək olar, fərqli parametr dəstləri ilə. Buna konstruktorun overload-u deyilir (metod overload-u barədə sonra danışacağıq).

Məsələn, parametrsiz konstruktor əlavə edək:

public class Student
{
    public string Name;
    public int Age;

    // Default konstruktor
    public Student()
    {
        Name = "Adsız";
        Age = 0;
    }

    // Parametrli konstruktor
    public Student(string name, int age)
    {
        Name = name;
        Age = age;
    }
}

İndi hər iki variant mümkündür:


Student s1 = new Student();          // Ad: Adsız, yaş: 0
Student s2 = new Student("Olya", 22); // Ad: Olya, yaş: 22

Konstruktorla validation etmək

Konstruktor — daxil olan datanın "keyfiyyətini" yoxlamaq üçün əla yerdir. Məsələn, student-in yaşı mənfi ola bilməz!


public Student(string name, int age)
{
    if (age < 0)
        throw new ArgumentException("Yaş mənfi ola bilməz!");
    Name = name;
    Age = age;
}

İndi kimsə Student("Balaca", -2) yaratmağa çalışsa, tətbiq exception atacaq (ArgumentException). Bu yanaşma tez-tez "dəmir-beton" data etibarlılığı üçün istifadə olunur.

3. Mürəkkəb obyektlərin inicializasiyası

Çox vaxt real tətbiqlərdə bir obyekt təkcə primitive-lərdən yox, başqa obyektlərdən də "yığılır":

public class Group
{
    public string GroupName;
    public Student[] Students;

    public Group(string groupName, Student[] students)
    {
        GroupName = groupName;
        Students = students;
    }
}

İndi student-lərdən ibarət group asanlıqla yaradıla bilər:

var students = new Student[]
{
    new Student("İvan", 20),
    new Student("Mariya", 19)
};
Group g = new Group("Qrup-101", students);

Field-lərin default dəyərlə inicializasiyası

Bəzən istəyirsən ki, bəzi field-lərə default dəyər verəsən, əgər bütün parametrlər konstruktora gəlmirsə. Məsələn, e-mail məcburi deyil:

public Student(string name, int age)
{
    Name = name;
    Age = age;
    Email = "unknown@noemail.com"; // Default dəyər
}

4. Object Initializer ilə inicializasiya

Konstruktorlarla yanaşı başqa rahat sintaksis də var — object initializer-lar. Konstruktoru çağırırsan, sonra isə qıvrım mötərizədə yeni obyektin property-lərinə dəyər verirsən:


public class Student
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string Email { get; set; }

    // Konstruktor yenə də tövsiyə olunur
    public Student(string name, int age)
    {
        Name = name;
        Age = age;
        Email = "";
    }
}

Student s = new Student("Anton", 18) { Email = "anton@domain.com" }; // konstruktor + property-lər

Bu sintaksis konstruktorun olması ilə əla işləyir, xüsusən də bəzi parametrlərin default dəyəri varsa və ya obyekt yaradanda onlar məlum deyilsə.

5. Tipik səhvlər və xüsusiyyətlər

Konstruktorlarla işləyərkən, yeni başlayanlar bir neçə yayılmış səhvlə qarşılaşır. Gəlin, onları barmaqla göstərək:

Səhv №1: Adların qarışması
Bəzən parametr və field adları qarışır, xüsusən də fərq yalnız böyük-kiçik hərfdədirsə.


public Student(string Name, int Age) // Böyük hərflə!
{
    Name = Name; // Oops! Hər iki Name parametrə referans verir. Field-in dəyəri dəyişməyəcək.
}

Düzgün yol: Obyektin field-ə referans üçün this istifadə et:

public Student(string name, int age)
{
    this.Name = name;
    this.Age = age;
}

Yaxud sadəcə fərqli adlar seç (məsələn, nameParam, ageParam), amma this. ilə işləmək yaxşı stil sayılır, xüsusən böyük layihələrdə.

Səhv №2: Default konstruktor yoxdur

Əgər ən azı bir konstruktor elan etmisənsə, sonra isə parametrsiz obyekt yaratmağa çalışırsansa — compilation error alacaqsan:

public class Student
{
    public Student(string name) { /*...*/ }
}

// kodun harasındasa
Student s = new Student(); // Səhv! Parametrsiz konstruktor yoxdur.

Həll: Açıq şəkildə parametrsiz konstruktor əlavə et:

public Student() { /*...*/ }

Səhv №3: Sonsuz rekursiya — konstruktor özünü çağırır


public Student()
{
    // Səhv! Özünü çağırır — sonsuz rekursiya.
    new Student();
}
2
Tapşırıq
C# SELF, səviyyə, dərs
Bağlanıb
Parametrlərlə konstruktor
Parametrlərlə konstruktor
2
Tapşırıq
C# SELF, səviyyə, dərs
Bağlanıb
Çətin obyektin massivlə təşkili
Çətin obyektin massivlə təşkili
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION