1-Mavzu 1-Mavzu Reja Klass a’zolariga ruxsatni boshqarish-fayllar.org
public bool ErrFlag; // oxirgi operatsiya bajarilganligini bildiruchi //Belgilangan o`lchamda massiv yaratish. public FailSoftArray(int size) { a = new int[size] ; Length = size; } // Bu FailSoftArray sinfi uchun indeksator. public int this[int index] { // get aksessori. get { if(ok(index) ) { ErrFlag = false; return a[index]; } else { ErrFlag = true; return 0; } } // set aksessor. set { if (ok(index)) { a[index] = value; ErrFlag = false; } else ErrFlag = true; } } // Indeks belgilangan chegaralarda bo'lsa, true mantiqiy qiymatini qaytarish. private bool ok(int index) { if(index >= 0 & index < Length) return true; return false; } } // Xatoliklardan xoli massivni qo`llash. class FSDemo { static void Main() { FailSoftArray fs = new FailSoftArray(); int x; // Yashirin xatolarni aniqlash. Console.WriteLine("Скрытыйсбой."); for (int i=0; i < (fs.Length * 2) ; i++) fs[i] = i*10; for(int i=0; i < (fs.Length * 2); i++) { x = fs[i]; if(x != -1) Console.Write(x + " "); } Console.WriteLine (); // Endi xatolarni ko'rsatish. Console.WriteLine("\nСбой с уведомлением об ошибках."); for(int i=0; i < (fs.Length * 2) ; i++) { fs[i] = i*10; if(fs.ErrFlag) Console.WriteLine("fs[" + i + "] внеграниц"); } for(int i=0; i < (fs.Length * 2); i++) { x = fs[i]; if(!fs.ErrFlag) Console.Write(x + " "); else Console.WriteLine("fs[" + i + "] внеграниц"); } } } Bu dasturning bajarilishi natijasida quyidagi natijalar olinadi. Скрытый сбой. 0 10 20 30 40 0 0 0 0 0 Сбой с уведомлением об ошибках. fs[5] вне границ fs[6] вне границ fs[7] вне границ fs[8] вне границ fs[9] вне границ 0 10 20 30 40 fs[5] вне границ fs[6] вне границ fs[7] вне границ fs[8] вне границ fs[9] вне границ Indeksator massiv chegaralarini buzishga to'sqinlik qiladi. Indeksator kodining har bir qismini diqqat bilan tahlil qilaylik. U keyingi satr bilan boshlanadi. public int this[int index] { Bu qatordagi kod indeksator e'loni kodi bo`lib, inttipidagi elementlar ustida ammalar bajariladi. Indeks indexparametri sifatida uzatiladi. Bundan tashqari, indeksator sinf tashqarisidagi kodda ko'rsatkich sifatida foydalanish imkonini berish uchun ochiq(public) deb e'lon qilinadi. Keyingi kodda get aksessorini ko`rib chiqaylik. get { if (ok(index) ) { ErrFlag = false; return a[index]; } else { ErrFlag = true; return 0; } } Birinchi navbatda getaksessori ko`rsatilgan indeks massiv chegarasida belgilanganligini tekshirib yuzaga kelishi mumkin bo`lgan xatolikning oldini oladi. Bu chegarani tekshirish ok()metodida amalga oshiriladi, agar indeks to`g`ri bo`lsa, truemantiqiy to`g`ri qiymatni, aks holda - falsemantiqiy yolg`on qiymatni qaytaradi. Shunday qilib, agar belgilangan indeks belgilangan chegaralarda bo'lsa, unda tegishli element ushbu indeksga qaytariladi. Agar indeks belgilangan chegaralardan tashqarida bo'lsa, unda hech qanday operatsiya amalga oshirilmaydi, biroq ayni paytda hech qanday ortiqcha xato bo'lmaydi. Bu holatda FailSoftArraysinfining ErrFlago'zgaruvchisi har bir operatsiya natijasini o'zida saqlaydi. Uning muvaffaqiyatli yoki muvaffaqiyatsiz bajarilganligini har bir operatsiyadan keyin tekshirish mumkin. Endi massiv chegaralarini buzish xatolari oldini olish uchun set aksessori kodini ko'rib chiqaylik. set { if(ok(index)) { a[index] = value; ErrFlag = false; } else ErrFlag = true; } Agar ok()metodining indexparametri belgilangan chegaralar ichida joylashgan bo`lsa, massivning tegishli elementiga valueparametriga uzatilgan qiymat o`natiladi. Aks holda, ErrFlag mantiqiy o`zgaruvchisiga true qiymat o'rnatiladi. Eslatib o'tamiz, valuehar qanday aksessor metoda belgilangan qiymatni o'z ichiga olgan yopiq parametrdir. Uni alohida e'lon qilish shart emas (va mumkin ham emas). Har ikkala get va set aksessorlarning indeksatorda mavjud bo`lishi majburiy emas. Shunday qilib, indeksatorni faqat o'qish uchun yaratsangiz unda faqat bitta aksessor olishingiz yoki indeksatorni faqat bitta aksessor bilan yozish uchun foydalanishingiz mumkin.