1. Sinifin elanının ümumi strukturu
Belə təsəvvür et: C#-da sinif — binanın çertyoju kimidir. Çertyojda biz təsvir edirik, neçə otaq var, divarların rəngi nədir, qapılar və pəncərələr haradadır. Sinifdə isə — obyektin hansı property-ləri var (məsələn, ad, yaş) və o nə edə bilir (məsələn, "salamlaşmaq", "maaş istəmək").
Sinifin elanı həmişə üç əsas blokdan ibarətdir:
- Access modifier (public, private, internal, protected) — bu sinifdən kim istifadə edə bilər. Sadəlik üçün indi public istifadə edəcəyik ki, sinif "hər yerdə görünən" olsun.
- class açar sözü — compiler başa düşsün ki, biz həqiqətən sinif təsvir edirik.
- SinifinAdi — böyük hərflə, konvensiyaya görə.
- Sinifin bədəni curly bracket-lərdə — burada sinifimizin bütün field, property, method-larını yazırıq.
Sxematik olaraq bu belə görünür:
public class SinifinAdi
{
// Burada sinifin field, property və method-ları olacaq
}
Nümunə: Student sinifi
public class Student
{
// Field-lar (obyektə aid dəyişənlər)
public string Name;
public int Age;
}
Hələlik bu sinif — boş qutu kimidir: biz təsvir etdik ki, student-in adı və yaşı olmalıdır, amma onu heç nəyə öyrətməmişik.
2. Sinifin field-ları (fields)
Field-lar — obyektə aid dəyişənlərdir. Məsələn, hər student-in öz adı və yaşı olmalıdır — ona görə də onlar field kimi yazılır:
public class Student
{
public string Name;
public int Age;
}
İndi, əgər sən Student tipində obyekt yaratsan, hər obyektin öz adı və yaşı olacaq.
Obyektin yaradılması nümunəsi:
Student sasha = new Student();
sasha.Name = "Sasha";
sasha.Age = 20;
Burada biz sasha obyektini yaratdıq, sonra isə ayrıca onun field-larına dəyər verdik. Bu üsul ən sadə start üçün istifadə olunur (constructor-lar barədə növbəti dərsdə ətraflı danışacağıq).
3. Sinifin method-ları (functions)
Method-lar — obyektin "fel"ləri, yəni onun davranışı. Obyektin edə bildiyi hərəkətlər. Məsələn, student salamlaşa bilər. Bunun üçün sinifin içində method yazılır:
public class Student
{
public string Name;
public int Age;
public void SayHello()
{
Console.WriteLine($"Salam, mənim adım {Name}, mənim {Age} yaşım var!");
}
}
İndi hər student "salamlaşa" bilər — özü də öz adı və yaşı ilə.
Method-un istifadəsi nümunəsi:
Student sasha = new Student();
sasha.Name = "Sasha";
sasha.Age = 20;
sasha.SayHello(); // Çap edəcək: Salam, mənim adım Sasha, mənim 20 yaşım var!
4. Sinifin property-ləri (properties)
Property-lər — "ağıllı" field-lardır, hansılara ki, dəyər oxuyanda və ya yazanda xüsusi hərəkət vermək olar. Müasir C#-da property-lər field-lardan daha çox istifadə olunur, çünki onlar daha çox nəzarət və çeviklik verir. Bu, elektrik kimidir: sadə görünür, amma imkanları çoxdur.
public class Student
{
public string Name { get; set; }
public int Age { get; set; }
}
Burada get; set; avtomatik field yaradır, amma gələcəkdə dəyər dəyişəndə əlavə məntiq əlavə etməyə imkan verir. Sinif istifadəçisi üçün property-lər field-lar kimi görünür.
Nümunə:
Student katya = new Student();
katya.Name = "Katya";
katya.Age = 18;
Console.WriteLine(katya.Name); // Katya
Property-lər barədə daha ətraflı — növbəti dərslərdə :P
5. Şərhlər
Darixdirici, amma vacib mövzu! Kodun qalan hissəsində olduğu kimi, sinifin içində də şərh yazmaq lazımdır ki, hansı field və ya method nə üçündür, izah edəsən:
public class Student
{
// Student-in adı
public string Name { get; set; }
// Student-in yaşı (ildə)
public int Age { get; set; }
// Student salamlaşır
public void SayHello()
{
Console.WriteLine($"Salam, mənim adım {Name}, mənim {Age} yaşım var!");
}
}
Bu, oxunaqlılığı artırır və hətta böyük layihədə belə itməkdən qoruyur.
6. Access modifier-lər
Access modifier-lər — demək olar ki, müxtəlif kilidli qapılar kimidir. Onlar müəyyən edir ki, sinifin üzvlərinə kim və haradan müraciət edə bilər. Əsas modifier-lər:
- public: hər yerdə əlçatandır (bizim default variant).
- private: yalnız bu sinifin içində əlçatandır.
- internal: cari assembly daxilində əlçatandır (layihələr, kitabxanalar).
- protected: sinifin və onun mirasçıları daxilində əlçatandır.
Xarici dünyadan gizlədilmiş field üçün nümunə:
public class Student
{
private int age; // Yalnız Student-in içində
public string Name { get; set; }
public void SetAge(int value)
{
if (value > 0)
age = value;
}
public int GetAge()
{
return age;
}
}
İlk mərhələlərdə tez-tez bütün üzvləri public elan edirlər ki, qarışmasın, amma real layihələrdə bu pis praktikadır: bəzi implementasiya detalları gizli qalmalıdır.
7. Sinifin static member-ləri
Bəzən sinifdə elə data və ya method-lar olur ki, onlar ayrıca obyektə yox, bütün sinifə aiddir. Bunlar — static member-lərdir (static members).
Məsələn: biz ümumi student sayğacı aparmaq istəyirik.
public class Student
{
public static int StudentsCount = 0;
public string Name { get; set; }
public int Age { get; set; }
}
Static member-ə sinifin adı ilə müraciət olunur:
Student.StudentsCount = 0;
Hər obyektin öz property/field-ları var, amma static-lər — hamı üçün ortaqdır. Yuxarıdakı nümunədə, əgər 10 student varsa, hərəsinin öz Name-i var, amma StudentsCount — hamı üçün birdir.
8. Nümunə: Tam student sinifi (method-lu versiya)
Gəlin hər şeyi birləşdirək və hər şeyi bacaran, düzgün yazılmış student sinifi yaradaq:
public class Student
{
// Student-lərin static sayğacı - bütün student-lərə aiddir
public static int Count = 0;
// Ad və yaş - property-lər
public string Name { get; set; }
public int Age { get; set; }
// Constructor (constructor-lar barədə — növbəti dərsdə)
public Student(string name, int age)
{
Name = name;
Age = age;
Count++; // Hər obyekt yaradanda sayğacı artırırıq
}
// Salamlaşma method-u
public void SayHello()
{
Console.WriteLine($"Salam! Mən {Name}. Mənim {Age} yaşım var.");
}
}
Əsas proqramda istifadə:
class Program
{
static void Main()
{
Student sasha = new Student("Sasha", 20);
Student katya = new Student("Katya", 22);
sasha.SayHello();
katya.SayHello();
Console.WriteLine($"Ümumi student sayı: {Student.Count}");
}
}
9. Kodun təşkili: bir fayl = bir sinif
.NET-də hər public sinifi ayrıca faylda saxlamaq adətdir, faylın adı sinifin adı ilə eyni olur. Məsələn:
Student.cs
|
|__ public class Student
Əsas proqram faylında (Program.cs) isə — giriş nöqtəsi və əsas kod olur. Bu, layihədə naviqasiyanı asanlaşdırır, xüsusən də siniflər çox olanda.
10. Sinif və obyektlərlə işləyərkən tipik səhvlər
Səhv №1: curly bracket-ləri unutmaq və ya səhv yerdə yazmaq.
Compiler dərhal error verəcək, amma həmişə aydın olmur ki, problem nədədir. Xüsusilə uzun konstruktorlarda bracket-lər "qaçanda" tapmaq çətin olur.
Səhv №2: eyni namespace-də iki sinifi eyni adla elan etmək.
Belə "yaradıcılıq" compiler-ə xoş gəlməyəcək. Yaxşı ki, belədir — yoxsa özün də başa düşməzsən, hansı sinifə müraciət edirsən.
Səhv №3: field-ə property ilə eyni ad vermək.
Bu, sinifin üzvlərinə müraciət edəndə qarışıqlıq yaradır. Hətta təcrübəli developer-lər bəzən başını tutur: "Mən field-ə müraciət edirəm, yoxsa property-yə?"
Səhv №4: access modifier yazmamaq.
Default olaraq sinif internal olur və əgər sən kitabxana yazırsansa — bu, kənardan sinifə girişə gözlənilmədən məhdudiyyət qoya bilər.
Səhv №5: static member-lərə instance ilə müraciət etmək.
Əgər student.Count əvəzinə Student.Count yazmasan, compiler bəlkə də icazə verəcək, amma bu, çaşdırıcıdır. Sən elə bil deyirsən ki, Count konkret student-ə aiddir, amma əslində — hamıya aiddir.
GO TO FULL VERSION