1. Parametrlər üçün defolt dəyərlər
Təsəvvür elə bir kofeçi var: əgər sən deməsən ki, kofeyə şəkər lazımdır ya yox, barista avtomatik bir qaşıq əlavə edəcək. Amma bəzən istəyirsən... iki qaşıq! Ya da ümumiyyətlə şəkərsiz (qəhrəmanlıq!). Methodlarda da eyni şey: bəzən rahat olur ki, bəzi parametrlər üçün standart dəyər təyin olunsun, əgər onları açıq şəkildə göstərməsən.
Adlandırılmış arqumentlər isə sanki kofe sifarişində deyirsən: “Südü mənə soya ver, adi yox”, fərq etməz, adətən inqrediyentlər hansı ardıcıllıqla verilir.
C#-da bu iki mexanizm kodunu daha təmiz, rahat və səhvlərdən qorunan edir. Onlar real layihələrdə tez-tez rast gəlinir: həm .NET kitabxanalarında, həm də məşhur framework-lərdə — ona görə işəgötürənlər görmək istəyir ki, sən bunlardan rahat istifadə edirsən.
Sintaksis
Funksiya parametrinə defolt dəyər birbaşa methodun elanında = işarəsi ilə verilir. Əgər method çağırışında bu parametr göstərilməyibsə, həmin defolt dəyər işləyəcək.
void PrintStudent(string name, int age = 18)
{
Console.WriteLine($"Tələbə: {name}, yaş: {age}");
}
Necə işləyir?
- Əgər PrintStudent("Alisa"); çağırsaq — ekrana çıxacaq: Tələbə: Alisa, yaş: 18.
- Əgər PrintStudent("Sasha", 22); çağırsaq — ekrana çıxacaq: Tələbə: Sasha, yaş: 22.
Bütün tiplər üçün işləyir?
Defolt dəyəri istənilən parametr tipi üçün vermək olar, amma bəzi özəlliklər var:
- Referans tipləri üçün (string, class-lar və s.): defolt olaraq null və ya konkret literal göstərmək olar.
- Qiymətli tiplər üçün (int, double, bool və s.): lazım olan tipin literalı yazılır.
- Enum-lar (enum), struct-lar üçün də defolt dəyər vermək mümkündür.
void AddStudent(string name, int course = 1, double averageScore = 5.0, string comment = null)
{
Console.WriteLine($"Əlavə olundu tələbə: {name}, kurs: {course}, orta bal: {averageScore}, şərh: {comment}");
}
Çağırışlar:
- AddStudent("İvan");
- AddStudent("Mariya", 2);
- AddStudent("Fyodor", 2, 4.7, "Fərqlənmə ilə");
Defolt dəyərli parametrlərin ardıcıllığı
Bütün qeyri-məcburi parametrlər (defolt dəyəri olanlar) sağda olmalıdır (bütün məcburi parametrlərdən sonra). Əgər defolt dəyərli parametri məcburinin qabağına qoysan, compiler əsəbiləşib qapını çırpacaq.
// Səhv!
void Test(int a = 1, int b)
{
// ...
}
Niyə belədir? Çünki əks halda compiler düzgün başa düşə bilməz ki, hansı arqument hansı parametrə aiddir method çağırışında.
2. Adlandırılmış arqumentlər
Adətən, method çağıranda və arqumentləri ötürəndə, onların ardıcıllığı methodun parametrlərinin ardıcıllığı ilə tam uyğun olmalıdır. Amma bəzən siyahı uzun olur, bəzi parametrlərin defolt dəyəri var və asanlıqla səhv etmək olar.
Adlandırılmış arqumentlər imkan verir ki, açıq şəkildə göstərəsən hansı arqument hansı parametrə aiddir, istənilən ardıcıllıqla.
AddStudent(name: "Elizaveta", averageScore: 4.2, comment: "Semestrin ən yaxşı tələbəsi");
- Burada kursu (course) göstərmirik, deməli, o 1 olacaq (defolt dəyər).
- comment parametrinin neçənci olduğunu yadında saxlamağa ehtiyac yoxdur — sadəcə adını yazırsan.
Hətta parametrlərin yerini dəyişə bilərsən:
AddStudent(averageScore: 3.7, name: "Georgi");
Bu çox rahatdır və kodu xeyli oxunaqlı edir!
Pozision və adlandırılmış arqumentlərin birgə istifadəsi
Adlandırılmış və pozision arqumentləri (adı olmadan) qarışdırmaq olar, amma bütün pozisionlar adlandırılmışlardan əvvəl olmalıdır.
// Düzgün
AddStudent("Sergey", averageScore: 4.9);
// Səhv
AddStudent(course: 2, "Filipp");
İlk adlandırılmış parametdən sonra qalanların hamısı da adlandırılmış olmalıdır. Compiler bu ardıcıllığa ciddi nəzarət edir ki, səni gözlənilməz hallardan qorusun.
Çoxlu parametri olan methodlarda rahatlıq
Bu, çoxlu əlavə opsiyaları olan methodlardan istifadə edəndə tez-tez tətbiq olunur. Məsələn, əgər istifadəçini bulud bazasına əlavə etmək üçün funksiya yazırsansa:
void RegisterUser(
string username,
string password,
string email = null,
bool admin = false,
bool sendWelcomeEmail = true,
string language = "ru"
)
Adlandırılmış arqumentsiz çağırış qorxulu görünür:
RegisterUser("cat", "qwerty", null, false, true, "ru");
Adlandırılmış arqumentlərlə isə hər şey oxunaqlı və rahatdır:
RegisterUser("cat", "qwerty", admin: true, sendWelcomeEmail: false, language: "en");
Məsləhət: kodun sənədsiz də oxunaqlı olması üçün adlandırılmış arqumentlərdən istifadə et!
3. İmplementasiya xüsusiyyətləri və tez-tez rast gəlinən səhvlər
Defolt dəyərlər və adlandırılmış arqumentlərdən istifadə etməyə yeni başlayanda, bir neçə yerdə səhv etmək olar.
- Parametrlərin ardıcıllığı. Defolt dəyərli parametrləri həmişə məcburilərdən sonra yerləşdir. Əgər yerlərini dəyişsən, compiler səhv verəcək.
- Kitabxanada defolt dəyərin dəyişdirilməsi. Əgər kitabxanada defolt dəyəri dəyişsən, köhnə istifadəçilər avtomatik yeni dəyəri istifadə etməyəcək. Defolt dəyər çağıran koda compile olunur. Ona görə, public kitabxanalarda defolt dəyərləri dəyişməzdən əvvəl yaxşı düşün.
- Pozision və adlandırılmış arqumentlərin qarışdırılması. Əgər pozision və adlandırılmış arqumentləri qarışdırdın, amma adlandırılmışdan sonra yenə pozision yazmağa çalışdın — bu işləməyəcək. Məsələn: Func(a: 1, 2) — səhv verəcək.
- Parametr adında yazı səhvi. Compiler burada sərtdir: əgər hərfi səhv yazsan (məsələn, naem: "Misha" yazsan), belə bir səhv alacaqsan: "Belə parametr yoxdur, sən nə edirsən axı?!".
GO TO FULL VERSION