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:
- Moslashuvchanlik: Bir xil o'zgaruvchiga turli xil turlarni saqlashingiz mumkin.
- Statik tekshiruvni o'tkazib yuborish: C# kompilyatori ushbu o'zgaruvchining haqiqiy turini bilmaydi va amallarni bajarilish vaqtida tekshiradi.
-
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);
}
}
`
Tushuntirish:
-
dynamic o'zgaruvchi = 5;
- Bu holdao'zgaruvchi
dastlab butun son (int) turida bo'ladi. -
o'zgaruvchi = "Salom";
- Keyino'zgaruvchi
string (matn) turiga o'zgaradi. -
o'zgaruvchi = DateTime.Now;
- Endio'zgaruvchi
sana va vaqtni ifodalovchi DateTime turida bo'ladi. -
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);
}
}
`
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);
}
}
}
`
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;
}
}
Hisobla
Tushuntirish: Ushbu misoldametodi har qanday turdagi argument bilan ishlay oladi va argumentga asoslangan holda javob beradi. Kompilyator
Hisobla` 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!";
}
}
dynamic` turidan foydalanish Excel bilan ishlashni osonlashtiradi, chunki Excelning COM interfeysi C# statik tiplari bilan bog'lanmagan.
Tushuntirish: Bu yerda
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);
}
}
dynamic
**Tushuntirish:** Bu misolda Reflection vabilan birgalikda ishlatiladi.
dynamicyordamida
Invoke` 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)