Agar siz C# dasturlash tilida ishlayotgan bo‘lsangiz, ref va out kalit so‘zlariga duch kelgan bo‘lishingiz mumkin. Ular ikkalasi ham o‘zgaruvchini qiymat emas, balki havola (reference) orqali uzatish uchun ishlatiladi. Ammo ularning orasida jiddiy farqlar bor, va bu farqlarni tushunish dasturchi sifatida siz uchun muhim.
Ushbu maqolada siz quyidagilarni bilib olasiz:
• ref nima?
• out nima?
• Ikkalasining farqi
• Qachon va qaysi birini ishlatish kerak?
• Bonus: Tuple orqali alternativ yechim
1. ref nima?
ref yordamida o‘zgaruvchini metodga havola orqali uzatamiz, ya’ni metod ichida qiymatini o‘zgartirsak, u tashqarida ham o‘zgaradi. Muhim shart — bu o‘zgaruvchi avvaldan qiymatga ega bo‘lishi kerak.
✅ Misol:
void DoubleValue(ref int number)
{
number *= 2;
}
int x = 10;
DoubleValue(ref x);
Console.WriteLine(x); // Output: 20
Bu yerda a ning qiymati metod ichida o‘zgartirildi va natijada u 20 ga teng bo‘ldi.
2. out nima?
out ham ref kabi havola orqali uzatiladi, lekin bu o‘zgaruvchi oldindan qiymatga ega bo‘lishi shart emas. Biroq, metod ichida unga albatta qiymat berilishi kerak.
✅ Misol:
void GetUser(out string name, out int age)
{
name = "Kamoliddin";
age = 23;
}
string userName;
int userAge;
GetUser(out userName, out userAge);
Console.WriteLine($"{userName}, {userAge}"); // Output: Kamoliddin, 23
Bu usul ko‘pincha bir nechta qiymatni metoddan qaytarish kerak bo‘lganda ishlatiladi.
Qachon qaysi birini ishlatish kerak?
• Agar siz o‘zgaruvchini metod ichida o‘zgartirib, natijasini tashqarida ishlatmoqchi bo‘lsangiz — ref.
• Agar siz metod orqali bir nechta qiymat qaytarmoqchi bo‘lsangiz — out.
• Ammo jamoaviy loyihalarda haddan tashqari ko‘p ref/out ishlatish kutilmagan muammolarga olib kelishi mumkin. Zamonaviy alternativlardan foydalanish tavsiya etiladi.
3. Bonus: Tuple yordamida toza alternativ
(string name, int age) GetUser()
{
return ("Kamoliddin", 23);
}
var result = GetUser();
Console.WriteLine($"{result.name}, {result.age}");
Bu usul ko‘proq zamonaviy va o‘qilishi oson hisoblanadi.
Xulosa
ref va out kalit so‘zlari sizga C# tilida kuchliroq metodlar yozishga imkon beradi. Ular yordamida siz metod orqali bir nechta qiymat uzatishingiz yoki mavjud qiymatlarni o‘zgartirishingiz mumkin. Lekin, zamonaviy C# versiyalarida tuple yoki class/struct orqali natijalarni uzatish tozaroq va xavfsizroq yondashuv hisoblanadi.