DEV Community

Elshod Ibodullayev
Elshod Ibodullayev

Posted on

C# da ref, out va in tushunchalari

C# da ref, out va in tushunchalari

C# dasturlash tilida metodlarga parametr (argument) uzatishning turli usullari mavjud.
Ko‘p hollarda oddiy qiymat uzatiladi, lekin ba’zan bizga qiymatni havola (reference) orqali uzatish kerak bo‘ladi.

Shu yerda ref, out va in kalit so‘zlari yordamga keladi.
Keling, ularni sodda misollar bilan tushunib chiqamiz. 🚀


Oddiy uzatish (by value)

void ChangeValue(int x)
{
    x = 100;
}

int num = 5;
ChangeValue(num);
Console.WriteLine(num); // 5 chiqadi
Enter fullscreen mode Exit fullscreen mode

👉 Oddiy holatda qiymat nusxasi metodga yuboriladi.
Shuning uchun tashqaridagi num o‘zgarmaydi.


ref kalit so‘zi

void ChangeValue(ref int x)
{
    x = 100;
}

int num = 5;
ChangeValue(ref num);
Console.WriteLine(num); // 100 chiqadi ✅
Enter fullscreen mode Exit fullscreen mode

ref orqali qiymat havola sifatida yuboriladi.

⚠️ Lekin ref ishlatishdan oldin parametrga qiymat berilishi shart.
ishlash diagrammasi tushunish uchun

out kalit so‘zi

void GetValues(out int a, out int b)
{
    a = 10;
    b = 20;
}

int x, y;
GetValues(out x, out y);
Console.WriteLine($"{x}, {y}"); // 10, 20 chiqadi ✅
Enter fullscreen mode Exit fullscreen mode

out orqali ham qiymat havola orqali yuboriladi, lekin metod ichida qiymat berilishi majburiy.

Bu ko‘pincha bitta metoddan bir nechta qiymat qaytarish uchun ishlatiladi.


in kalit so‘zi

void PrintValue(in int x)
{
    // x = 50; ❌ Error – o‘zgartirib bo‘lmaydi
    Console.WriteLine(x);
}

int num = 30;
PrintValue(in num); // 30 chiqadi ✅
Enter fullscreen mode Exit fullscreen mode

in parametri havola orqali yuboriladi, lekin metod ichida o‘zgartirish mumkin emas.

Bu usul katta obyektlarni nusxa qilmasdan samarali uzatish uchun ishlatiladi.


Xulosa

  • ref → qiymatni havola orqali uzatadi, o‘zgartirish mumkin.
  • out → havola orqali uzatadi, lekin metod ichida qiymat berish majburiy.
  • in → havola orqali uzatadi, lekin metod ichida o‘zgartirish mumkin emas.

    static void Main()
    {
        int a = 5;           // ref uchun kirish qiymati mavjud
        int b;               // out uchun kirish qiymati yo‘q
        int c = 10;          // in uchun faqat o‘qiladi

        Console.WriteLine($"Boshlang‘ich qiymatlar: a={a}, c={c}");

        ProcessValues(ref a, out b, in c);

        Console.WriteLine($"Natija: a={a}, b={b}, c={c}");
    }

    static void ProcessValues(ref int x, out int y, in int z)
    {
        x += 10;         // ref parametr o‘zgartiriladi
        y = z * 2;       // out parametrga qiymat beriladi
        Console.WriteLine($"Funksiya ichida: x={x}, y={y}, z={z}");
        // z += 5;       // Xato! in parametr o‘zgarmaydi
    }
}
// natija 
// Boshlang‘ich qiymatlar: a=5, c=10
// Funksiya ichida: x=15, y=20, z=10
// Natija: a=15, b=20, c=10

Enter fullscreen mode Exit fullscreen mode

Top comments (0)