logo
post image
user image

DIGITAL GENERATION

Muallif

June 7, 2024

172

​C#. dynamic. Dynamic Language Runtime

C#

C# aniq statik turlangan dasturlash tili bo'lishiga qaramasdan, ba'zi dinamik turlar imkoniyatlari qo'shilgan. .Net 4.0 versiyasidan boshlab, DLR(Dynamic Language Runtime) nomli yangi funksional mavjud. DLR IronPython va IronRuby dinamik tillardan foydalanish imkonini beruvchi muhit taqdim etadi.

Bu yangilikning mohiyatini tushunish uchun dinamik va statik turlangan tillar farqini bilib olish kerak. Statik turlangan tillarda hamma turlar va ular oilasiga mansub barcha turlar, xossalar va metodlar turlari kompilyatsiya bo'layotgan vaqt aniqlanadi. Dinamik turlangan tillarda esa dastur bajarilish vaqtigacha tizimga turlarning xossalari va metodlari haqida hech narsa ma'lum bo'lmaydi.

Shu DLR muhit sababli C# da dinamik obyektlar yaratish mumkin va ularning a'zolari dastur ishlayotgan vaqt aniqlanadi va ularni odatiy ravishda aniq statik turlangan obyektlar bilan birga qo'llash mumkin.

DLR'dan foydalanishning eng muhim nuqtasi dynamic turlarni qo'llashdan iborat bo'ladi. Bu kalit so'zi kompilyatsiya vaqti turlarni "turlarni aniqlash va tekshirish" bosqichidan o'tib ketish imkonini beradi. Bundan tashqari dynamic tur bilan e'lon qilingan obyektlar dastur ishlayotgan vaqti o'z turini almashtirishi mumkin. Masalan:

class Program
{
    static void Main(string[] args)
    {
        dynamic x = 3; // bu yerda x - int butun son
        Console.WriteLine(x);
 
        x = "Salom, Dunyo"; // x - qator
        Console.WriteLine(x);
 
        x = new Person() { Name = "Vejon", Age = 28 }; // x - Person - obyekti
        Console.WriteLine(x);
 
        Console.ReadLine();
    }
}
class Person
{
    public string Name {get;set;}
    public int Age { get; set; }
 
    public override string ToString()
    {
        return Name + ", " + Age.ToString();
    }
}

Yuqoridagi kodda x o'zgaruvchisi dastur ishlashi davomida o'z turini bir necha bor o'zgartirishiga qaramasdan, bu dastur hech qanday muommosiz ishlaydi. dynamic'ni bunday qo'llanilishi uni var kalit so'zini qo'llanilishidan ajratib turadi. var kalit so'zi yordamida e'lon qilingan o'zgaruvchilarning turlari kompilyatsiya vaqti faqat bir bor aniqlanadi va u dastur ishlash vaqti o'zgarmaydi.

Shu bilan birga, dynamic va object turi o'rtasida yana bir umumiylikni ko'rish mumkin. Yuqoridagi misolda biz dynamic'ni objectga o'zgartirsak: oject x = 3; bo'lsa natija o'zgarmaydi. Lekin bu yerda ozgina farq bor:

object obj = 24;
dynamic dyn = 24;
obj += 4; // mumkin emas
dyn += 4; // mumkin

obj += 4; qatorida biz xatoni ko'rishimiz mumkin, += operatsiyasini object va int turlariga nisbatan qo'llab bo'lmaydi. dynamic deb e'lon qilingan o'zgaruvchi bilan esa bunday muommo yuz bermaydi, chunki u dastur bajarilayotgan vaqt aniqlanadi.

dynamic'dan foydalanishning yana bir muhim farqi shundan iboratki, dynamic'ni nafaqat o'zgaruvchilarga nisbatan balki, xossalar va metodlarga nisbatan ham qo'llash mumkin.

class Person
{
    public string Name {get;set;}
    public dynamic Age { get; set; }
 
    // berilgan formatga ko'ra maoshni chiqaramiz
    public dynamic getSalary(dynamic value, string format)
    {
        if (format=="string")
        {
            return value + " so'm";
        }
        else if (format == "int")
        {
            return value;
        }
        else
        {
            return 0.0;
        }
    }
 
    public override string ToString()
    {
        return Name + ", " + Age.ToString();
    }
}    

Person klassida Age dinamik xossasi e'lon qilingan, shuning uchun ushbu xossaga biron bir qiymat berayotganda person.Age=33 ham, person.Age="o'tiz uch" ham qilishimiz mumkin. Ikkala holda ham hech qanday xato bo'lmaydi.

Shu bilan birga, getSalary metodi dynamic qiymat qaytaradi. Masalan, berilgan parametrga qarab xohlasak yoki qator ko'rinishida, yoki son ko'rinishida oylik foydani qaytarishimiz mumkin. Bunda metod parametr sifatida dynamic'ni qabul qiladi. Shunday qilib biz, foydani qiymatini pametr sifatida ham butun son, ham qandaydir kasr son ko'rinishida berishimiz mumkin bo'ladi. Quyidagi misol bu ko'rsatilgan:

dynamic person1 = new Person() { Name = "Vejon", Age = 28 };
Console.WriteLine(person1);
Console.WriteLine(person1.getSalary(28.09, "int"));
 
dynamic person2 = new Person() { Name = "WinStyle", Age = "yigirma yetti yosh" };
Console.WriteLine(person2);
Console.WriteLine(person2.getSalary(30, "string"));

Manba:  metanit

Izohlar