تفاوت انواع var و dynamic
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: یک دقیقه

در ابتدا به توضیحاتی درباره کنترل نوع به صورت ایستا و کنترل نوع در زمان اجرا، توجه کنید:

کنترل نوع ایستا (Static Type Checkingکامپایلر را قادر به بررسی درستی برنامه می‎کند، بدون آنکه آن را اجرا کند.  مثلاً کد زیر با خطا مواجه می‎‎شود:
int x = "5";
کنترل نوع در زمان اجرا (RunTime Type Checking)، هنگامی که برنامه اجرا می‎شود این کنترل توسط CLR صورت می‌گیرد و موقع تایپ کد، خطایی گرفته نمی‎شود مثلاً:

object y = "5";
int z = (int) y; //downcast خطای زمان اجرا و شکست 
downcast به عمل تبدیل نوع کلاس پایه به یکی از کلاس‎های مشتق شده، گفته می‌شود.
 
پس از ذکر مقدمه بالا به این سؤال می‎پردازیم که تفاوت انواع var و dynamic  چیست؟
کلمه کلیدی var و کلمه کلیدی dynamic  علی‌الظاهر کاربرد یکسانی دارند اما تفاوت اساسی آن‎ها عبارت است از این‌که  نوع واقعی متغیرهایی از نوعvar ، توسط کامپایلر تعیین می‎شود. یعنی متغیرهایی از نوع var کنترل نوعشان به صورت ایستاست اما نوع واقعی‌ متغیرهایی از نوعdynamic ، در زمان اجرا مشخص می‎شود. یعنی متغیرهایی از نوع  dynamic کنترل نوعشان به صورت کنترل نوع در زمان اجراست. به کد زیر توجه کنید:
dynamic x = "hello"; // این متغیر در زمان کامپایل از نوع دینامیک است و در زمان اجرا از نوع رشته‌ای است 
var y = "hello"; //این متغیر هم در زمان کامپایل و هم در زمان اجرا از نوع رشته‌ای است 
int i = x; // خطای زمان اجرا
int j = y; //خطای زمان کامپایل

همچنین متغیری که نوعشvar  است می‎تواند مقداری از نوع dynamic  را شامل شود.

dynamic x = "hello";
var y = x; // این متغیر در زمان کامپایل دینامیک است
int z = y; // خطای زمان اجرا
 
  • #
    ‫۱۱ سال و ۱۲ ماه قبل، چهارشنبه ۱۲ مهر ۱۳۹۱، ساعت ۱۲:۰۱
    تفاوت مهم دیگه‌ای که بین این دو وجود دارد این است که می‌توان نوع تعریف شده توسط dynamic را در حین کدنویسی تغییر داد اما اینکار برای var امکان پذیر نیست(با انتساب اول نوع برای متغیر درنظر گرفته می‌شود.برای مثال:
    int k=100;
    var data1=k;
    dynamic data2=k;
    data1="Hello World!"// خطای حین کامپایل به دلیل تغییر نوع
    data2="Hello World!"//بدون خطا در زمان کامپایل و یا اجرا
    
  • #
    ‫۱۱ سال و ۱۲ ماه قبل، چهارشنبه ۱۲ مهر ۱۳۹۱، ساعت ۱۴:۰۲
    کارکرد کلمه کلیدی var تحت عنوان Type Inference (استنتاج نوع) شناخته می‌شود. این اصطلاح به این معنی است که در زمان کامپایل نوع متغییر قابل تشخیص است و صرفا یک راهکار برای سادتر شدن کار برنامه نویس است، در عمل و از دید کامپایلر این همان تعریف متغییر معمولی (statically typed) است.

    Type inference

    از آنجایی که DLR بر روی CLR پیاده شده است dynamic در واقع خودش استاتیک است! اما قابلیت‌های دینامیک بودن را ارائه می‌کند.
    statically typed dynamic

     
    • #
      ‫۱۱ سال و ۱۲ ماه قبل، چهارشنبه ۱۲ مهر ۱۳۹۱، ساعت ۱۵:۵۷
      DLR از CLR که مساوی (GC/JIT/sandboxed security model/etc) هست استفاده می‌کنه اما فقط از سرویس‌های آن و نه اینکه ذاتا و نهایتا استاتیک کار کند.
      DLR یک opcode جدید را به این مجموعه اضافه می‌کند به نام InvokeDynamic که پیشتر در CLR موجود نبوده.

      • #
        ‫۱۱ سال و ۱۲ ماه قبل، چهارشنبه ۱۲ مهر ۱۳۹۱، ساعت ۲۰:۲۲
        بله اینها صحیح، ولی statically typed dynamic عبارتی است که Anders Hejlsberg هنگام صحبت در مورد آینده C# در  PDC09 به کاربرد.
        The Future of C#
         
        The dynamic keyword acts as a static type declaration in the C# type system. This way C# got the dynamic features and at the same time remained a statically typed language. 

        http://msdn.microsoft.com/en-us/magazine/gg598922.aspx 
        در واقع کلمه کلیدی dynamic به کامپایلر می‌فهماند که compile-time checking  را غیر فعال کن! تا در زمان اجرا به نوع متغییر رسیدگی شود.

        شاید اگر بگوییم dynamic نوعی static است که مزایای انواع dynamic را در بر می‌گیرد بهتر باشد.

        خواندن این مقاله هم خالی از لطف نیست:
  • #
    ‫۷ سال و ۴ ماه قبل، شنبه ۹ اردیبهشت ۱۳۹۶، ساعت ۰۵:۳۶
    dynamic  var
     نیاز به مقدار دهی اولیه ندارد
    dynamic foo;
     نیاز به مقدار دهی اولیه دارد
    var foo = "it is a test string";
    عدم نمایش intellisense
    نمایش intellisense