دات‌نت ویژه

تفاوت بین dynamic vs object in csharp

1

از نقاط قوت (و گاهی سردرگمی‌کننده) زبان سی‌شارپ اشاره دارد

چرا سی‌شارپ این همه نوع داده دارد؟

برای اینکه هر کدام برای یک کار خاص ساخته شده‌اند. نه مسخره‌بازی است، نه اضافی!


جدول تفاوت var، object و dynamic

نوع داده زمان تشخیص خطا کی استفاده کنیم؟
var زمان کامپایل وقتی نوع رو می‌دونیم ولی نوشتن اسمش طولانیه (مثل LINQ)
object زمان کامپایل وقتی می‌خوایم هر چیزی رو توی یه متغیر بریزیم (با سربار تبدیل)
dynamic زمان اجرا وقتی با داده‌های متغیر کار می‌کنیم (مثل JSON یا Python)

مثال ساده با omg()

dynamic x = 10;
object y = 10;

x.omg();  // ❌ خطا در زمان اجرا (برنامه کرش می‌کنه)
y.omg();  // ❌ خطا در زمان کامپایل (اجازه اجرا نمیده)
  • dynamic : تا اجرا صبر می‌کنه، بعد می‌گه int این متد رو نداره.
  • object : همین الان کامپایلر خطا می‌ده و نمی‌ذاره برنامت ساخته بشه.

کی از کدوم استفاده کنیم؟

موقعیت انتخاب
مطمئنی نوع چیه؟ var
هر چیزی رو می‌خوای نگه داری؟ object
با دیتای نامشخص کار داری؟ dynamic

خلاصه‌تر:
var = راحت‌نویسی
object = جعبه‌ی همه‌چیز
dynamic = انعطاف‌پذیری با هزینه خطا در اجرا
photo_2026-08-03_12-21-38

1
نوشته‌شده توسط محمد نظری من اینجا هستم تا دانشم رو با شما به اشتراک بذارم

دیدگاه‌ها 1

برای ارسال دیدگاه یا پسند، وارد شوید.

ورود / ثبت‌نام
Farahmandian2011@gmail.com

به نظرم پاسخ به این سؤال نیازمند تفکیک چند مفهوم است: نوع استاتیک متغیر، نوع واقعی مقدار در زمان اجرا و زمان انجام binding آبجکت یا همان `object` یک نوع در سیستم نوع .NET و ریشه‌ی سلسله‌مراتب نوع‌هاست. وقتی متغیری از نوع `object` تعریف می‌شود، نوع استاتیک آن `object` است و کامپایلر عملیات را بر اساس همین نوع بررسی می‌کند؛ بنابراین برای استفاده از اعضای اختصاصی نوع واقعی مقدار، معمولاً به cast نیاز داریم. داینامیک یا `dynamic` نیز یک نوع در C# است، اما تفاوت اصلی آن با `object` در نحوه‌ی انجام binding است. در `dynamic` بسیاری از بررسی‌ها، از جمله بررسی اعضا و انتخاب overload، از زمان کامپایل به زمان اجرا منتقل می‌شوند. بنابراین خطاهایی که در حالت عادی ممکن است هنگام کامپایل شناسایی شوند، می‌توانند به خطاهای زمان اجرا تبدیل شوند. همچنین `dynamic` به این معنا نیست که «نوع متغیر در زمان اجرا تشخیص داده می‌شود»؛ کامپایلر می‌داند متغیر `dynamic` است. آنچه به زمان اجرا واگذار می‌شود، عمدتاً binding و بررسی عملیات است. نهایتاً `var` نیز موضوع متفاوتی است؛ نوع آن در زمان کامپایل از عبارت مقداردهی استنتاج می‌شود و پس از آن کاملاً استاتیک است. خلاصه: `object` به نوع استاتیک متغیر، `var` به استنتاج نوع در زمان کامپایل و `dynamic` به binding پویا در زمان اجرا مربوط است.