تفاوت نوع Var و Dynamic در #C

شنبه 24 مرداد 1394

در این مقاله به اختصار نوع داده Var و Dynamic را در #C بررسی می کنیم.

تفاوت نوع Var و Dynamic در #C

#C در انواع داده بسیار انعطاف پذیر می باشد. #C  انواع داده ها مانند  Object , var ، dynamic فراهم می کند که برای ذخیره ی هر نوع داده ای مورد استفاده قرار می گیرد.

در ادامه تفاوت انواع Var و Dynamic در #C را همراه با نمونه هایی در رفتار آن ها شرح می دهیم.

1. نوع Var در نسخه 3.0 #C، نوع Dynamic در نسخه ی  4.0 #C اضافه شده است.

2. نوع Var می تواند متغیرهای گوناگونی از هر نوعی را در خود ذخیره کند.فقط باید در هنگام تعریف نوع Var، متغیر مقدار دهی اولیه شود.نوع متغیر مشخص نمی باشد و با اولین مقدار دهی به متغیر نوع آن مشخص می شود، در حالیکه نوع داینامیک می تواند متغیر از هر نوعی را در خود ذخیره کند، مشابه متغیرهای زبان قدیمی VB.

3. Var نوع داده امنی است. به طور مثال کامپایلر همه ی اطلاعات مقادیر ذخیره شده را دارد، بنابراین خطای زمان کامپایل رخ نمی دهد، در حالیکه نوع Dynamic امن نیست زیرا کامپایلر اطلاعات هر نوع متغیر را ندارد.

4. نوع Var نمی تواند به عنوان آرگومان تابع ارسال شود و متد نمی تواند در آخر نوع Object بازگرداند. نوع Var در حوزه ای که در آن تعریف شده استفاده می شود، نوع داینامیک هم به عنوان آرگومان تابع ارسال می شود و هم می تواند به عنوان داده بازگشتی از متد بازگردانده شود.

5. در نوع Var تبدیل نوع نیاز نیست زیرا کامپایلر تمام اطلاعات مربوط به انجام عملیات را دارد. تبدیل نوع در نوع  داینامیک هم نیاز نیست اما جزئیات متدها و properties نوع ذخیره شده نیاز است.

6.درنوع  Var خطای زمان کامپایل رخ نمی دهد زیرا کامپایلر اطلاعات تمام مقادیر ذخیره شده را دارد.  در حالیکه در نوع داینامیک اگر properties و متدهای غلط استفاده شوند، امکان رخ دادن خطا وجود دارد، زیرا تمام اطلاعات مقادیر ذخیره شده در زمان اجرا مشخص می شوند.

7. زمانی که نوع متغیر را نمی دانیم به طور مثال نوع متغیر anonymous(بی نام ) از کلمه کلیدی Var استفاده می کنیم. اما نوع  داینامیک زمانی مفید است که بخواهیم با استفاده از reflection کد بزنیم و یا از زبان های داینامیک استفاده کنیم و یا از اشیای Com استفاده کنیم، زیرا که نیاز داریم خط کدهای کمتری بنویسیم.

dynamic test = 1;  
var test2=2;

زمانی که ما ماوس رو روی کلمه کلیدی Var در کد بالا قرار می دهیم  intellisense نشان می دهد که کامپایلر به درستی تشخیص داده است که  نوع متغیر تخصیص داده شده به کامپایلر شناخته شده است و آن int 32 می باشد. اما اگر ماوس را روی داینامیک قرار دهیم.همچنان  Dynamic  نمایش داده می شود زیرا نوع داینامیک در زمان اجرا تعیین می شود.

// Can I change the type of data stored in dynamic?   
  
dynamic test = 1;  
test = "I am a string now"; // compiles and runs just fine  
  
var test2 = 2;test2 = "I am a string now"; // will give compile error


این یکی از تفاوت های کلیدی نوع داینامیک و  Var است. Var یک نوع متغیر ضمنی می باشد که توسط کامپایلر تشخیص داده می شود، اما دقیقا مثل آن است که به طور صحیح نوشته باشیمint test2 = 2;”. از طرف دیگر، نوع داینامیک تمام بررسی نوع داده در زمان کامپایل را نادیده گرفته و همه آنها را در زمان اجرا مشخص می کند.

خط آخر در کد بالا کامپایل نمی شود، و کامپایلر خطا می گیرد. در کد زیر، دستوراتی نوشته ایم که این تفاوت را بهتر نشان دهیم. در کد بالا، چون متغیر test2 اولین بار یک مقدار integer گرفته، زمانی که برای بار دوم مقدار رشته به آن می دهیم با خطا مواجه می شویم، اما داینامیک اینگونه نیست.

// Can I change the type of data stored in dynamic?   
dynamic test = 1;  
Console.WriteLine("Dynamic as " + test.GetType() + ": " + test);  
test = "I am a string now"; // compiles and run just fine  
  
Console.WriteLine("Dynamic as " + test.GetType() + ": " + test);  
var test2 = 2;  
//test2 = "I am a string now"; // will give compile error  
Console.WriteLine("Var as " + test2.GetType() + ": " + test2);

خروجی زیر تولید می شود.

Dynamic as System.Int32: 1

Dynamic as System.String: i'm a string now

Var as System.Int32:2

آموزش سی شارپ

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان
  • C#.net
  • 3k بازدید
  • 2 تشکر

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید