DEV Community

islomAli99
islomAli99

Posted on

C# - Dynamic Types

C# tilida dynamic turidagi o'zgaruvchilar kompilatsiya vaqtida emas, balki bajarilish vaqtida tiplashni aniqlashga imkon beradi. Bu shuni anglatadiki, siz dynamic o'zgaruvchiga har qanday ma'lumot turini tayinlashingiz va uning ustida amallar bajarishingiz mumkin, lekin C# uni tekshirishni vaqti kelganda, ya'ni dastur ishlayotgan paytda bajaradi.

Dynamic Type`dan foydalanishning asosiy sabablari:

  1. Moslashuvchanlik: Bir xil o'zgaruvchiga turli xil turlarni saqlashingiz mumkin.
  2. Statik tekshiruvni o'tkazib yuborish: C# kompilyatori ushbu o'zgaruvchining haqiqiy turini bilmaydi va amallarni bajarilish vaqtida tekshiradi.
  3. COM interop: dynamic COM ob'ektlar bilan ishlashda foydali bo'lishi mumkin, chunki ular statik tiplashdan foydalanmaydi.

Misol:

`

using System;

class Program
{
    static void Main()
    {
        dynamic o'zgaruvchi = 5; // integer qiymat
        Console.WriteLine("Qiymat: " + o'zgaruvchi);

        o'zgaruvchi = "Salom"; // string qiymat
        Console.WriteLine("Qiymat: " + o'zgaruvchi);

        o'zgaruvchi = DateTime.Now; // DateTime turi
        Console.WriteLine("Hozirgi sana: " + o'zgaruvchi);

        // Hatto dinamik turdagi o'zgaruvchiga ham funksiya chaqirish mumkin
        o'zgaruvchi = new Program();
        o'zgaruvchi.QaytishSalom("Ahmad");
    }

    public void QaytishSalom(string ism)
    {
        Console.WriteLine("Salom, " + ism);
    }
}
Enter fullscreen mode Exit fullscreen mode


`
Tushuntirish:

  1. dynamic o'zgaruvchi = 5; - Bu holda o'zgaruvchi dastlab butun son (int) turida bo'ladi.
  2. o'zgaruvchi = "Salom"; - Keyin o'zgaruvchi string (matn) turiga o'zgaradi.
  3. o'zgaruvchi = DateTime.Now; - Endi o'zgaruvchi sana va vaqtni ifodalovchi DateTime turida bo'ladi.
  4. o'zgaruvchi.QaytishSalom("Ahmad"); - o'zgaruvchi ob'ekt bo'lgach, u QaytishSalom funksiyasini chaqiradi.

Dynamic turlarning kamchiligi shundaki, kompilyator xatolarni topa olmaydi, shuning uchun bajarilish vaqtida xatoliklar paydo bo'lishi mumkin. Shuning uchun dinamik turlarni ishlatishda ehtiyot bo'lish lozim.

Maslahat: Har doim aniq ma'lumot turidan foydalanish xavfsizroq, lekin kerakli moslashuvchanlik uchun dynamic turlardan foydalanish kerak bo'lsa, ularni ehtiyotkorlik bilan qo'llang.

C# tilida dynamic turini ishlatish dasturchiga katta moslashuvchanlik beradi, lekin bu turdan foydalanishda bajarilish vaqtida yuzaga keladigan xatolar ehtimolini hisobga olish kerak. Endi dynamic haqida ko'proq ma'lumot va qo'shimcha misollar keltirib o'taman.

1. Dynamic va boshqa turlarning o'zaro munosabati

dynamic o'zgaruvchi har qanday turdagi ma'lumotlarni saqlashi mumkin. Ushbu turda saqlangan qiymatni keyinroq boshqa statik turlarga o'zgartirish mumkin.

`

using System;

class Program
{
    static void Main()
    {
        dynamic o'zgaruvchi = 10;  // Integer tur
        int son = o'zgaruvchi;     // Bu joyda to'g'ridan-to'g'ri int turiga aylantiriladi
        Console.WriteLine("Son: " + son);

        o'zgaruvchi = "Bu matn";   // Endi string turiga aylanadi
        string matn = o'zgaruvchi; // String turiga aylantiriladi
        Console.WriteLine("Matn: " + matn);
    }
}

Enter fullscreen mode Exit fullscreen mode


`

2. Dynamic turlarda xatoliklar

Agar dynamic o'zgaruvchisiga noto'g'ri amal bajarilsa, xatolik bajarilish vaqtida sodir bo'ladi.

`

using System;

class Program
{
    static void Main()
    {
        dynamic o'zgaruvchi = 100;
        // Matn sifatida ishlov berishga urinish natijasida xatolik
        try
        {
            Console.WriteLine(o'zgaruvchi.Length); // int turida Length xususiyati mavjud emas
        }
        catch (Microsoft.CSharp.RuntimeBinder.RuntimeBinderException ex)
        {
            Console.WriteLine("Xato: " + ex.Message);
        }
    }
}

Enter fullscreen mode Exit fullscreen mode


`

Tushuntirish: Bu yerda o'zgaruvchi integer qiymatga ega, lekin Length xususiyati faqat stringlarda mavjud, shuning uchun xatolik yuz beradi.

3. Metod va dynamic turlari

Dynamic turidan foydalanish bilan metod chaqirish osonlashadi, ayniqsa bir xil nomli metodlarni har xil turdagi parametrlar bilan ishlatish kerak bo'lsa.

`

using System;

class Program
{
    static void Main()
    {
        dynamic o'zgaruvchi = 5;
        dynamic natija = Hisobla(o'zgaruvchi);
        Console.WriteLine("Natija (int): " + natija);

        o'zgaruvchi = 5.5;
        natija = Hisobla(o'zgaruvchi);
        Console.WriteLine("Natija (double): " + natija);
    }

    static dynamic Hisobla(dynamic son)
    {
        return son * 2;
    }
}

Enter fullscreen mode Exit fullscreen mode



Tushuntirish: Ushbu misolda
Hisoblametodi har qanday turdagi argument bilan ishlay oladi va argumentga asoslangan holda javob beradi. KompilyatorHisobla` metodiga aniq tur berishdan ko'ra, runtime (bajarilish vaqtida) davomida ishlaydi.

4. COM obyektlar bilan ishlash

C# dynamic COM obyektlar bilan ishlashda juda foydali. Masalan, Microsoft Office ilovalari bilan ishlashda.

`

using System;
using Excel = Microsoft.Office.Interop.Excel;

class Program
{
    static void Main()
    {
        Excel.Application excelApp = new Excel.Application();
        excelApp.Visible = true;

        dynamic workbooks = excelApp.Workbooks;
        dynamic workbook = workbooks.Add();
        dynamic worksheet = workbook.Sheets[1];
        worksheet.Cells[1, 1].Value = "Hello, Excel!";
    }
}

Enter fullscreen mode Exit fullscreen mode



Tushuntirish: Bu yerda
dynamic` turidan foydalanish Excel bilan ishlashni osonlashtiradi, chunki Excelning COM interfeysi C# statik tiplari bilan bog'lanmagan.

5. Dynamic va Reflection bilan ishlash

dynamic turini ishlatib Reflection orqali metodlar va xususiyatlarga murojaat qilish oson bo'ladi.

`

using System;

class Program
{
    static void Main()
    {
        dynamic type = Type.GetType("System.String");
        dynamic metod = type.GetMethod("Contains", new Type[] { typeof(string) });

        bool mavjud = metod.Invoke("Salom dunyo", new object[] { "dunyo" });
        Console.WriteLine("Satr mavjudmi: " + mavjud);
    }
}

Enter fullscreen mode Exit fullscreen mode



**Tushuntirish:** Bu misolda Reflection va
dynamicbilan birgalikda ishlatiladi.dynamicyordamidaInvoke` chaqiriladi va runtime davomida metod ishlatiladi.

Dynamic turlardan foydalanishning afzalliklari:

  • Moslashuvchanlik: Har xil turdagi qiymatlarni saqlash va ularga ishlov berish.
  • Statik tiplashdan voz kechish: Agar ma'lumotning aniq turi oldindan noma'lum bo'lsa yoki kompyuterning runtime tekshiruvi kerak bo'lsa.
  • COM obyektlar va Reflection bilan integratsiya: Obyektlarga statik tiplashsiz murojaat qilishni osonlashtiradi.

Kamchiliklari:

  • Xatolarga moyillik: Statik tiplashdan foydalanmaslik bajarilish vaqtida xatoliklarning paydo bo'lish ehtimolini oshiradi.
  • Bajarilish samaradorligi pastroq bo'lishi mumkin: Dynamic turlar bilan ishlash runtime davomida ko'proq vaqt talab qilishi mumkin.

Top comments (0)