5-Mavzu: ref va out parametrlari. Ko’rsatkichli va qiymatli turlar


Download 29.24 Kb.
bet1/3
Sana02.12.2023
Hajmi29.24 Kb.
#1779486
  1   2   3

5-Mavzu: ref va out parametrlari. Ko’rsatkichli va qiymatli turlar.
C# dasturlash tilida turlar ikkita sinfga bo’linadi:

  1. Qiymatli turlar;

  2. Ko’rsatkichli turlar.

Bu ikkita sinf bir-biridan samaradorligi va xotirada ma’lumotlarni saqlash bilan farq qiladi.
Qiymatli turlarni yana strukturali yoki tuzilmali sinflar deb ham atash mumkin. Bunday turdagi ma’lumotlar xotiraning stek deb nomlangan qismida saqlanadi. Stek bu lokal o’zgaruvchilarning qiymatlarini saqlaydigan xotira bo’lagi. Qiymat turlariga quyidagilar kiradi:

  1. Butun turlar(byte, sbyte, char, short, ushort, int uint, long, ulong);

  2. Suzuvchi nuqtali turlar(float, double);

  3. O’nli turlar(Decimal);

  4. Rost, yolg’on qiymat qabul qiluvchi tur(bool);

  5. Foydalanuvchi tomonidan aniqlangan strukturali(struct);

  6. Sanaluvchi turlar(enum).

Bunday turdagi o’zgaruvchilarning o’zlashtirgan(qabul qilgan) qiymati shu o’zgaruvchining o’zida saqlanadi. Misol uchun:

C#

static void Main(string[] args)
{
int a=1;
int b=2;
b=a;
a=3;
Console.WriteLine(a); //3
Console.WriteLine(b); //1
}


Ko’rsatkichli turlar, bunday turdagi o’zgaruvchilar o’zlarida ma’lumot emas, balki shu ma’lumotni ko’rsatuvchi xotira adreslarni saqlaydi, ma’lumotlarning o’zlari esa xotiraning “uyum” deb nomlangan qismida saqlanadi. Xotiraning bu sohasida boshqaruvchi obyektlar joylashadi. Ko’rsatkichli turlarga quyidagilar kiradi:

  1. Sinflar(class);

  2. Interfeyslar(interface);

  3. Delegatlar(delegate);

  4. Obyektlar(object);

  5. Satrli tur(string).

Ko’rsatkichli turlarga doir misol ko’rib chiqamiz:

C#

class Test
{
Public int x;
}
Class Program
{ static void Main(string[] args)
{
Test a=new Test();
Test b=new Test();
a.x = 1;
b.x = 2;
b = a;
b.x = 3;
Console.WriteLine(a.x); //3 Console.WriteLine(b.x); //3 }
}

C# dasturlash tilida o’zgaruvchilarning qiymatlari metodlarga uzatiladi. Bundan ma’lumki, biz metod ichkarisida metodning tashqarisidagi parametrlarni o’zgartira olmaymiz. Misol uchun:



C#

class Program
{
static void Main(string[] args)
{
int a = 1;
ChangeValue(a);
Console.WriteLine(a); //1
Console.ReadLine();
}
public static void ChangeValue(object a) {
a = 2;
}
}

Bu masalani yechish uchun ref kalit so’zidan foydalanamiz. Ref kalit so’zidan foydalanish uchun metodni chaqirishda parameter oldidan ishlatamiz va metodni e’lon qilganda parametrning oldidan yoziladi. Yuqoridagi dasturni quyidagicha o`zgartiramiz:

C#



class Program
{
static void Main(string[] args)
{
int a = 1;
ChangeValue(ref a);
Console.WriteLine(a); //2
Console.ReadLine();
}
public static void ChangeValue(ref int a) {
a = 2;
}
}


Ref parametrining xususiyati shundan iboratki, metodni chaqirishdan oldin o’zgaruvchini boshlang’ich qiymat bilan ta’minlash shart, aks holda xatolik yuz beradi. Ref parametriga doir yana bir misol bilan tanishib chiqamiz. Bu misolda yangi metod yaratamiz va bu metodning o’zgaruvchisi son qabul qilsin. Ushbu metodda o’zgaruvchi birga oshiriladi va qiymati chiqariladi. Main() metodida esa xuddi avvalgi nom bilan yangi o’zgaruvchi yaratamiz va uning qiymatini ham chiqaramiz. Natijada testMethod(param) chaqirilgandan keyin Main() metodidagi param o`zgaruvchisining qiymati o`zgarmay qoladi:

C#

static void Main(string[] args)
{
int param = 10;
testMethod(param);
Console.WriteLine(" param qiymati:" + param); //10
Console.ReadLine();
}
static void testMethod(int param) {
param++;
Console.WriteLine("qiymati " + param); //11
}

Endi quyidagi kodda ref parametrini testMethod metodidagi o’zgaruvchi oldidan qo’llaymiz. Shuni unutmaslik kerakki, metodni chaqirishda ham ref parametrini qo’llash kerak:



C#

static void Main(string[] args)
{
int param = 10;
testMethod(ref param);
Console.WriteLine("param qiymati:" + param); //11
Console.ReadLine();
}
static void testMethod(ref int param) {
param++;
Console.WriteLine("qiymati " + param); //11
}

Endi dastur natijasi sifatida 11 sonini hosil bo`ladi. Buning sababi, param o’zgaruvchisining xotirada joylashgan joyiga havola qilinganligidadir, shuningdek, testMethod metodida nusxa bilan emas, balki Main() metodidagi param o’zgaruvchisi bilan ishlangan. Bu o’zgarishlarni biz testMethod metodida param o’zgaruvchisi ustida bajardik va bu o’zgarishlar metod tanasidan tashqarida bajarilgan.
Endi yana bir marta bu kodga o’zgarishlar kiritamiz. Bu safar ham param o’zgaruvchisini e’lon qilamiz, ammo unga boshlang’ich qiymat bermaymiz, ya’ni int param = 10; satri o’rniga int param; deb yozamiz. Kompilyator boshlang’ich qiymati berilmagan o’zgaruvchidan foydalanishda xatolik beradi. Biz boshlang’ich qiymatga ega bo’lmagan o’zgaruvchidan boshqa metodda foydalanishga va uning ustida belgilangan amallarni bajarishga harakat qilyapmiz, lekin ref yordamida bunday qilib bo’lmaydi. Bunday holatlarda out parametridan foydalanish maqsadga muvofiq:

C#

static void Main(string[] args)
{
int param;
testMethod(out param);
Console.WriteLine("qiymati" + param); //11
Console.ReadLine();
}
static void testMethod(out int param) {
param = 10;
param++;
Console.WriteLine("qiymati " + param); //11
}

testMethod() metodida param o’zgaruvchisiga boshlang’ich qiymat berish shart.
Ref va out parametrlarini ishlatish orqali xotiradan foydalanish samaradorligi oshiriladi.


Download 29.24 Kb.

Do'stlaringiz bilan baham:
  1   2   3




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling