5-bo‘lim

Shartlar va namuna moslashtirish

if va else, shartli operator, switch ifodasi, is operatori, tur va xossa namunalari, mantiqiy namunalar va ro'yxat namunalari.

🕑 14 daqiqa o‘qish 📄 682 so‘z 👁 1 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. if, else if, else
  2. Mantiqiy amallar
  3. Shartli operator
  4. switch ifodasi
  5. Diapazon namunalari
  6. is operatori va tur namunalari
  7. Mantiqiy namunalar
  8. Ro'yxat namunalari
  9. Xossa namunalari
  10. Eski switch ko'rsatmasi
  11. Xulosa

Shartlar har qanday dasturning asosi. C# da ular oddiy if dan boshlanadi, lekin namuna moslashtirish (pattern matching) ni qo'shganda ancha kuchli vositaga aylanadi.

if, else if, else #

CSHARP
int ball = 87;

if (ball >= 90)
{
    Console.WriteLine("A'lo");
}
else if (ball >= 70)
{
    Console.WriteLine("Yaxshi");
}
else if (ball >= 60)
{
    Console.WriteLine("Qoniqarli");
}
else
{
    Console.WriteLine("Qoniqarsiz");
}
Natija
Yaxshi
Qavslarni tashlab ketmang

C# bitta ko'rsatma uchun { } ni talab qilmaydi:

CSHARP
if (ball >= 70)
    Console.WriteLine("Yaxshi");

Bu ishlaydi, lekin xavfli odat. Keyin ikkinchi qatorni qo'shsangiz, u shartdan tashqarida qoladi va buni sezish qiyin.

Bu haqiqiy va mashhur xato: 2014-yilda Apple tizimidagi jiddiy xavfsizlik zaifligi aynan qavssiz if dan keyin ikkinchi qator qo'shilgani sababli yuzaga kelgan.

Qoida: har doim qavs qo'ying, hatto bitta qator bo'lsa ham.

Mantiqiy amallar #

CSHARP
int yosh = 20;
bool talabami = true;

Console.WriteLine(yosh >= 18 && talabami);
Console.WriteLine(yosh < 18 || talabami);
Console.WriteLine(!talabami);
Natija
True
True
False
AmalMa'nosi
&&VA - ikkalasi ham rost bo'lsa
||YOKI - kamida bittasi rost bo'lsa
!EMAS - teskarisi
Qisqa tutashuv

&& va || qisqa tutashuv bilan ishlaydi: natija ma'lum bo'lganda o'ng tomon umuman hisoblanmaydi.

CSHARP
string? ism = null;

if (ism != null && ism.Length > 3)
{
    Console.WriteLine("Uzun ism");
}
else
{
    Console.WriteLine("Ism yo'q yoki qisqa");
}
Natija
Ism yo'q yoki qisqa

Birinchi shart false bo'lgani uchun ism.Length umuman chaqirilmadi - aks holda dastur qulardi. Shu sababli tekshiruvlar tartibi muhim: avval null ni tekshiring, keyin qolganini.

Shartli operator #

Qisqa tanlov uchun ?: ishlatiladi:

CSHARP
int ball = 87;

string natija = ball >= 60 ? "o'tdi" : "o'tmadi";
Console.WriteLine($"Talaba {natija}");

int a = 15, b = 23;
Console.WriteLine($"Kattasi: {(a > b ? a : b)}");
Natija
Talaba o'tdi
Kattasi: 23

switch ifodasi #

Zamonaviy C# da switch qiymat qaytaradi. Bu eski switch ko'rsatmasidan ancha qulay:

CSHARP
int kun = 3;

string nom = kun switch
{
    1 => "Dushanba",
    2 => "Seshanba",
    3 => "Chorshanba",
    4 => "Payshanba",
    5 => "Juma",
    6 or 7 => "Dam olish kuni",
    _ => "Noma'lum"
};

Console.WriteLine(nom);
Natija
Chorshanba
BelgiMa'nosi
=>Shu holat uchun qaytariladigan qiymat
orBir nechta qiymatni birlashtiradi
_Qolgan barcha holatlar
switch ifodasi barcha holatni qamraganini tekshiradi

Eski switch ko'rsatmasida unutilgan holat jimgina o'tib ketardi. switch ifodasi esa mos holat topilmasa SwitchExpressionException tashlaydi.

Ya'ni xato yashirinmaydi - darhol ko'rinadi. Shuning uchun _ ni faqat haqiqatan kerak bo'lganda qo'ying.

Diapazon namunalari #

Sonni oraliqqa tekshirish uchun switch juda qulay:

CSHARP
int ball = 87;

string baho = ball switch
{
    >= 90 => "A'lo",
    >= 70 => "Yaxshi",
    >= 60 => "Qoniqarli",
    _ => "Qoniqarsiz"
};

Console.WriteLine($"{ball} ball -> {baho}");
Natija
87 ball -> Yaxshi

Bu bobning boshidagi if/else if zanjiri bilan bir xil ish qiladi, lekin ancha qisqa va o'qish oson.

is operatori va tur namunalari #

is qiymatning turini tekshiradi va darhol o'zgaruvchiga yozadi:

CSHARP
object[] narsalar = [42, "salom", 3.14, true, 'A'];

foreach (object narsa in narsalar)
{
    string tavsif = narsa switch
    {
        int son => $"butun son: {son}",
        string matn => $"satr, uzunligi {matn.Length}",
        double kasr => $"kasr son (yaxlitlangan): {Math.Round(kasr)}",
        bool mantiq => $"mantiqiy: {mantiq}",
        _ => $"boshqa tur: {narsa.GetType().Name}"
    };

    Console.WriteLine(tavsif);
}
Natija
butun son: 42
satr, uzunligi 5
kasr son (yaxlitlangan): 3
mantiqiy: True
boshqa tur: Char

Har bir holatda tur tekshirildi va qiymat mos turdagi o'zgaruvchiga yozildi - alohida aylantirish kerak bo'lmadi.

Mantiqiy namunalar #

and, or va not namunalarni birlashtiradi:

CSHARP
int[] sonlar = [-5, 0, 7, 42, 150];

foreach (int son in sonlar)
{
    string turkum = son switch
    {
        < 0 => "manfiy",
        0 => "nol",
        > 0 and < 10 => "kichik",
        >= 10 and <= 99 => "o'rta",
        _ => "katta"
    };

    Console.WriteLine($"{son,4} -> {turkum}");
}
Natija
  -5 -> manfiy
   0 -> nol
   7 -> kichik
  42 -> o'rta
 150 -> katta

Ro'yxat namunalari #

C# 11 dan massiv va ro'yxat tuzilishini ham tekshirish mumkin:

CSHARP
int[][] toplamlar =
[
    [],
    [7],
    [1, 2],
    [1, 2, 3, 4, 5]
];

foreach (int[] toplam in toplamlar)
{
    string tavsif = toplam switch
    {
        [] => "bo'sh",
        [int bitta] => $"bitta element: {bitta}",
        [int birinchi, int ikkinchi] => $"ikkita: {birinchi} va {ikkinchi}",
        [int bosh, .. int[] qolgan] =>
            $"boshi {bosh}, yana {qolgan.Length} ta",
    };

    Console.WriteLine(tavsif);
}
Natija
bo'sh
bitta element: 7
ikkita: 1 va 2
boshi 1, yana 4 ta

.. belgisi "qolgan hammasi" degani. Bu juda kuchli vosita: ro'yxatni qismlarga ajratish uchun indekslar bilan ishlash kerak emas.

Xossa namunalari #

Obyektning ichidagi qiymatni ham tekshirish mumkin. Buni 9-bo'limda sinflar bilan tanishgach to'liq ishlatamiz, hozir esa oddiy misol:

CSHARP
(string shahar, int aholi)[] joylar =
[
    ("Namangan", 626000),
    ("Toshkent", 2900000),
    ("Chust", 68000)
];

foreach (var joy in joylar)
{
    string turkum = joy switch
    {
        { aholi: > 1000000 } => "megapolis",
        { aholi: > 100000 } => "yirik shahar",
        _ => "kichik shahar"
    };

    Console.WriteLine($"{joy.shahar,-10} {turkum}");
}
Natija
Namangan   yirik shahar
Toshkent   megapolis
Chust      kichik shahar
Ketma-ketlik muhim

Namunalar yuqoridan pastga tekshiriladi va birinchi mos kelgani ishlaydi.

Yuqoridagi misolda > 100000 shartini birinchi qo'ysangiz, Toshkent ham "yirik shahar" bo'lib qolardi - chunki 2.9 million ham 100 mingdan katta.

Qoida: eng tor shartni yuqoriga, eng kengini pastga qo'ying.

Eski switch ko'rsatmasi #

Eski kodda uchraydi, shuning uchun tanish bo'lishi kerak:

CSHARP
int kun = 6;

switch (kun)
{
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:
        Console.WriteLine("Ish kuni");
        break;
    case 6:
    case 7:
        Console.WriteLine("Dam olish");
        break;
    default:
        Console.WriteLine("Noma'lum");
        break;
}
Natija
Dam olish
switch ko'rsatmasiswitch ifodasi
Qiymat qaytaradimiYo'qHa
break kerakmiHa, majburiyYo'q
YozilishiUzunQisqa
QachonBir nechta amal bajarilgandaQiymat tanlanganda
Amaliy topshiriq
  1. Ball bo'yicha baho beruvchi if/else if zanjirini yozing.
  2. Xuddi shu mantiqni switch ifodasi bilan qayta yozing.
  3. Qavssiz if xatosini o'zingiz yaratib ko'ring.
  4. Qisqa tutashuv nima uchun kerakligini null misolida tushuntiring.
  5. Shartli operator (?:) bilan ikki sondan kattasini toping.
  6. object massivi ustida tur namunalarini qo'llang.
  7. Sonni beshta turkumga ajratuvchi mantiqiy namuna yozing.
  8. Ro'yxat namunasi bilan bo'sh, bitta va ko'p elementli massivlarni ajrating.
  9. Namunalar tartibini ataylab buzib, natija qanday o'zgarishini ko'ring.
  10. Eski switch da bitta break ni olib tashlab, kompilyator nima deyishini ko'ring.

Xulosa #

  • if dan keyin har doim qavs qo'ying - bu mashhur xavfsizlik xatosining sababi bo'lgan.
  • && va || qisqa tutashuv qiladi: null tekshiruvini birinchi yozing.
  • switch ifodasi qiymat qaytaradi, break talab qilmaydi va qamrab olinmagan holatda istisno tashlaydi.
  • Diapazon namunalari (>= 90 =>) uzun if/else if zanjirini almashtiradi.
  • Tur namunasi (int son =>) turni tekshiradi va bir vaqtda o'zgaruvchiga yozadi.
  • and, or, not namunalarni birlashtiradi.
  • Ro'yxat namunasi ([bosh, .. qolgan]) to'plam tuzilishini tekshiradi.
  • Namunalar yuqoridan pastga tekshiriladi - eng tor shart yuqorida bo'lsin.

Keyingi bo'limda sikllarni o'rganamiz.

Xatolik topdingizmi?

Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.