تفاوت بین dynamic و ExpandoObject در سیشارپ
هر دو برای مدیریت پویا در سیشارپ استفاده میشن، اما از نظر کاربرد و عملکرد تفاوتهای مهمی دارن:
- ماهیت: dynamic یک نوع خاصه که به کامپایلر میگه بررسی نوع و اعضا رو به زمان اجرا (runtime) موکول کن.
- انعطاف: میتونی متغیرهایی از هر نوع (مقداری یا مرجع) بهش تخصیص بدی و در زمان اجرا نوعش تغییر کنه.
- اعضا: هر چیزی که متغیر بهش اشاره کنه، اعضای اون نوع قابل دسترسیه (یعنی اگر متغیر مقدار رشته ای داشته باشه، تمام متدهای رشته رو میشه براش استفاده کرد مثلا ToUpper). اما خود dynamic نمیتونه اعضای جدید (پراپرتی و متد) اضافه کنه.
- ماهیت: ExpandoObject بخشی از فضای نام System.Dynamic است و بهت اجازه میده اعضای جدید (property یا method) رو در زمان اجرا به یک شیء اضافه کنی.
- انعطاف: بیشتر شبیه به یک شیء پویا (dynamic object) در زبانهای پویا مثل Python یا JavaScript عمل میکنه.
- اعضا: میتونی به صورت پویا اعضای جدید (property یا method) به یک شیء اضافه کنی یا اعضای موجود رو حذف کنی.
مثال: dynamic
dynamic obj = "Hello, World!"
Console.WriteLine(obj.Length); // 13
obj = 123;
Console.WriteLine(obj + 10); // 133
- نمیتونی مستقیماً یک property جدید اضافه کنی:
obj.NewProperty = "Test" // زمان اجرا خطا میده
مثال: ExpandoObject
using System.Dynamic;
dynamic expando = new ExpandoObject();
expando.Name = "John" // اضافه کردن یک property
expando.Age = 30; // اضافه کردن یک property جدید
Console.WriteLine($"{expando.Name}, {expando.Age}"); // John, 30
اضافه کردن متد:
expando.Greet = (Action)(() => Console.WriteLine($"Hello {expando.Name}!"));
expando.Greet(); // Hello John!
چه زمانی از هرکدام استفاده کنیم؟
نوع dynamic:
- وقتی نوع داده یا رفتار متغیر از قبل مشخص نیست و فقط در زمان اجرا میتونی تصمیم بگیری.
- مثال: دریافت داده از یک API یا JSON.
نوع ExpandoObject:
- وقتی نیاز داری یک شیء پویا با اعضای دلخواه در زمان اجرا بسازی و اون رو مدیریت کنی.
- مثال: ساختن یک مدل پویا برای دادههایی که ساختار ثابت ندارن.
- جمعبندی:
- نوع dynamic: ابزاریه که بهت اجازه میده رفتار شیء رو در زمان اجرا مدیریت کنی، ولی نمیتونی مستقیماً عضو جدید اضافه یا حذف کنی.
- نوع ExpandoObject: یه شیء پویا واقعی که میتونی بهش property و متد جدید اضافه کنی.