1. C#-da əsas giriş modifikatorları
Proqram yazanda çox vaxt dəqiq bilmək istəyirsən ki, kim və haradan sənin dəyişənlərini görə və ya dəyişə bilər, metodları çağıra bilər. Bu, çoxmənzilli binadakı kimi bir şeydir: bütün otaqlar hamı üçün açıq deyil. Bəzilərinə yalnız sakinlər, bəzilərinə isə texniki işçilər girə bilər.
Proqramlaşdırmada bu "girişə nəzarət" giriş modifikatorları ilə həll olunur. Onlar müəyyən edir ki, sinifin üzvü (dəyişən, field, metod, property və s.) sinifdən kənarda, başqa sinifdə, başqa layihədə görünür, ya yox. Bu, OOP-də inkapsulyasiyanın əsas tətbiqlərindən biridir: biz reallaşdırma detallarını gizlədirik, yalnız lazım olan "interfeysləri" çölə veririk.
Burada əsas modifikatorlar və onların qısa təsviri olan cədvəl var:
| Modifikator | Harada görünür? (sadə dillə) |
|---|---|
|
Hər yerdə (layihə daxilində və xaricində — əgər assembly əlavə olunubsa) |
|
Yalnız həmin sinifin içində |
|
private ilə eynidir |
Qorxulu görünür? Əslində heç bir çətinlik yoxdur. Gəlin nümunələrlə baxaq, hansını harada istifadə etmək yaxşıdır.
2. public modifikatoru — kim istəyir gəlsin
public modifikatoru sənin dəyişənini və ya metodunu hər yerdə görünən edir. Əgər sinif üzvünü public elan etmisənsə, sənin sinifini görən istənilən başqa kod ona müraciət edə bilər.
public class Person
{
public string Name;
public void SayHello()
{
Console.WriteLine($"Salam! Mənim adım {Name}");
}
}
İndi istənilən yerdə (eyni layihədə və ya başqa layihədə, əgər assembly əlavə olunubsa) belə yaza bilərsən:
Person p = new Person();
p.Name = "Alisa";
p.SayHello();
Praktik məsləhət: hər şeyi public etmə — bu, kodunun təhlükəsizliyinə zərərdir.
3. private modifikatoru — bu şəxsi əmlakdır!
private modifikatoru sinifin içindəkiləri gizlədir: çöldən heç kim nə olduğunu görməyəcək və məlumatı dəyişə bilməyəcək. C#-da default olaraq bütün field və metodlar — private-dir, əgər başqa modifikator yazmamısan.
public class Cup
{
private double volume; // Bu field-ı yalnız Cup sinfi görür
public void Fill(double value)
{
volume = value; // Sinifin içində istifadə etmək olar
}
public double GetVolume()
{
return volume; // Amma çöldən heç kim volume-un olduğunu bilmir
}
}
Burada volume hamıdan gizlədilib, amma Cup sinfinin istənilən metodu onu istifadə edə bilər. Həcmi öyrənmək üçün public metod GetVolume() veririk.
4. Görünürlük sahəsi: dəyişənlər, metodlar və siniflər
Görünürlük sahəsi — proqramda sənin adının (dəyişən, metod, sinif) mənası və əlçatan olduğu zonadır.
- Lokal dəyişənlər (metodun və ya kod blokunun içində elan olunubsa): yalnız həmin metodda və ya blokda görünür.
- Metod parametrləri: yalnız metodun içində görünür.
- Sinif field-ları: sinif daxilində hər yerdə görünür (giriş modifikatorundan asılı olaraq).
- Siniflər: nested sinif yalnız wrapper sinifdə görünür, əgər o privatedirsə və s.
Görünürlük sahəsi ilə bağlı nümunəyə baxaq:
public class Counter
{
private int count = 0; // sinifdə hər yerdə görünür
public void Increment()
{
count++; // field istifadə edə bilərik
int temp = count * 2; // temp yalnız Increment-da görünür
}
public int GetCount()
{
// temp burada görünmür!
return count;
}
}
Əgər temp-ə GetCount()-da müraciət etməyə çalışsan — error alacaqsan.
5. Dəyişənlərin kölgələnməsi (shadowing)
Kölgələnmə — bu, bir sahədə (scope) dəyişən (və ya parametr) elə bir adla elan olunur ki, xarici sahədə də eyni ad var. Bu blokun içində “yeni” ad kölgələyir köhnəni və xarici dəyərə birbaşa müraciət etmək olmur.
Kölgələnmə nümunəsi:
class ShadowDemo
{
int value = 10; // sinif field-ı
void PrintValue()
{
Console.WriteLine(value); // 10 — sinif field-ı
int value = 5; // lokal dəyişən sinif field-ını kölgələyir
Console.WriteLine(value); // 5 çıxacaq, 10 yox
}
}
Bu nümunədə, int value = 5; yazanda, bu sinif field-ını kölgələyir və metodun içində həmin adla lokal dəyişən işləyir. value-ya PrintValue()-da müraciət edəndə, lokal dəyişən istifadə olunacaq, sinif field-ı yox.
Əgər yenə də sinif field-ına müraciət etmək lazımdırsa, this açar sözündən istifadə olunur:
class ShadowDemo
{
int value = 10;
void PrintValue()
{
Console.WriteLine(value); // 10 — sinif field-ı
int value = 5;
Console.WriteLine(value); // 5 — lokal dəyişən
Console.WriteLine(this.value); // 10 — sinif field-ı
}
}
Kölgələnmə çaşdırıcı ola bilər, ona görə dəyişənlərə mənalı, fərqli adlar vermək məsləhətdir — xüsusilə böyük komandada işləyirsənsə.
GO TO FULL VERSION