Ko’rsatkichlar (pointers) — xotira manziliga bevosita murojaat qiladigan o’zgaruvchilar. C#’da ko’rsatkichlar C++’dagi kabi keng ishlatilmaydi, chunki til xotirani avtomatik boshqaradi. Biroq maxsus, past darajali vazifalar uchun C# ularni unsafe (xavfli) kontekstda qo’llab-quvvatlaydi.
Ko’rsatkich (pointer) — boshqa o’zgaruvchining xotira manzilini saqlaydigan maxsus o’zgaruvchi. C#’da ular faqat
unsafebloklarda ishlatiladi.
C#’da ko’rsatkichlar nima uchun kam ishlatiladi?
C# xavfsizlikni birinchi o’ringa qo’yadi. Xotirani garbage collector avtomatik boshqargani uchun, dasturchi manzillar bilan bevosita ishlashga deyarli hech qachon majbur bo’lmaydi. Buning o’rniga C# murojaat turlari (reference types) va ref kalit so’zini beradi — bular ko’rsatkichlarning xavfsiz muqobilidir.
ref bilan manzil orqali uzatish
Ko’rsatkich o’rniga C#’da ref ishlatiladi. U o’zgaruvchini manzil orqali uzatib, uni funksiya ichida o’zgartirish imkonini beradi:
using System;
void Oshir(ref int son)
{
son = son + 10;
}
int a = 5;
Oshir(ref a);
Console.WriteLine(a); // a o'zgardi
15
ref orqali a ning o’zi (nusxasi emas) uzatildi, shuning uchun funksiya uni o’zgartira oldi. Bu ko’rsatkichlarning xavfsiz va o’qiladigan muqobilidir.
unsafe kontekst
Agar haqiqiy ko’rsatkichlar kerak bo’lsa (masalan, past darajali optimizatsiya yoki C kutubxonalari bilan ishlash uchun), C# unsafe blokini beradi:
using System;
unsafe
{
int son = 26;
int* ptr = &son; // manzilni olamiz
Console.WriteLine($"Qiymat: {*ptr}");
}
Qiymat: 26
int* ptr — ko’rsatkich, &son — manzil, *ptr — dereferensiya (qiymatga kirish). Bu C++’dagiga o’xshaydi, ammo unsafe blokida va maxsus sozlama bilan ishlaydi.
Qiymat va murojaat: xavfsiz yondashuv
Amaliy jadval — C#’da xotira bilan ishlash yo’llari:
| Yondashuv | Xavfsizmi | Qachon |
|---|---|---|
| Murojaat turlari | ha | obyektlar bilan ishlash |
ref / out |
ha | funksiyada o’zgartirish |
Ko’rsatkich (unsafe) |
yo’q | past darajali maxsus vazifalar |
Xulosa
Bu bo’limda C#’da ko’rsatkichlar nega kam ishlatilishini, ref bilan xavfsiz manzil uzatishni va unsafe kontekstdagi haqiqiy ko’rsatkichlarni ko’rib chiqdik. C#’da deyarli har doim xavfsiz muqobillar afzal ko’riladi. Keyingi darsda funksiyalarga o’tamiz.