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:
dynamicCOM 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'zgaruvchidastlab butun son (int) turida bo'ladi. -
o'zgaruvchi = "Salom";- Keyino'zgaruvchistring (matn) turiga o'zgaradi. -
o'zgaruvchi = DateTime.Now;- Endio'zgaruvchisana va vaqtni ifodalovchi DateTime turida bo'ladi. -
o'zgaruvchi.QaytishSalom("Ahmad");-o'zgaruvchiob'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. 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!";
}
}
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.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)