تفاوت var - object - dynamic
نام دوره: زبان سی شارپ مقدماتی
نویسنده: علی مقدم جاه (مدرس دوره)
تفاوت متغیرهای var و object و dynamic چیست؟
در همین ابتدای کار خدمتتان عرض کنیم که موضوع این پست آموزشی، یک سوال استخدامی در اکثر شرکتها و سازمانها است.
کلمه کلیدی object
این کلمه از ورژن اول سیشارپ بوده و کلاسی است که برای تمامی کلاسهای از پیش تعریف شده داخل بسته دات نت (NET.) و همچنین تمامی کلاسهایی که ما برنامه نویسان مینویسیم، بصورت پیش فرض والد است.
درنتیجه از آنجایی که object یک کلاس است و در پست آموزش انواع Data Type با آن به عنوان یک نوع داده آشنا شدیم، پس میتوانیم یک شئ یا نمونه از آن تعریف کرده تا به عنوان یک ظرف یا همان متغیر قابل استفاده باشد:
object age;
نکته: موقع تعریف یک شئ یا نمونه از کلاس object، نیازی به مقداردهی اولیه نمیباشد.
کلمه کلیدی var
این کلمه در ورژن سوم سیشارپ عرضه شد که بیشترین کاربرد آن را در مباحث حلقههای تکرار و LINQ قطعا مشاهده کردهاید.
از کلمه var نیز برای تعریف یک متغیر میتوان استفاده کرد تا به عنوان ظرف نگهدارنده داده برای ما قابل دسترس باشد.
اما تفاوت بین object با Var در چیست؟
همانطور که در بالا مشاهده نمودید، میتوانیم در هنگام تعریف یک شئ یا نمونه از کلاس object، آن را مقداردهی اولیه نکنیم، اما این موضوع در Var صدق نکرده و بالاجبار باید در زمان تعریف یک شئ یا نمونه با استفاده از Var، حتما آن را مقدار دهی اولیه کنیم.
var age = 26;
حال ممکن است برایتان سوال پیش آید که چرا باید حتما Var مقداردهی اولیه شود، اما object نه؟
کلمه Var در لحظه کامپایل شدن کد، یعنی دقیقا همان لحظه که شما آن را در IDE خود مینویسید و به آن مقداری را میدهید، با وجود اینکه هنوز برنامه را اجرا نکرده اید، اما var خودش را شبیه به نوع دادهای میکنه که تو لحظه تعریف به آن مقداردهی کرده اید!
مثلا در مثال زیر خود را شبیه یک خانه از نوع string میکند:
var name = "ali";
یا در مثلا در مثال زیر خود را شبیه یک خانه از نوع int میکند:
var age = 26;
اما object اینگونه نیست؛ یعنی وقتی شما دستور زیر را مینویسید:
object name = "ali";
تا زمانی که برنامه خود را اجرا نکنید، object name خود را تبدیل به شکل string نمیکند!
نکته: پس var در لحظه کامپایل شدن (یعنی زمانی که کد را مینویسید)، تبدیل به شکلی از نوع داده ورودی خود میکند، اما object در لحظه اجرا شدن تبدیل به شکلی از نوع داده ورودی خود میشود.
این از تفاوت اول میان var با object، اما تفاوت دوم:
شما اگر متغیری از جنس object را تعریف کنید، در هر لحظه از برنامه میتوانید نوع داده آن را با مقداری که برای آن مشخص میکنید، تغییر دهید و کامپایلر آخرین مقداری که شما در آن قرارداده اید را ملاک تبدیل شکل object به آن نوع دادهای میکند:
object test;
test= 'a';
test= 1375;
test= true;
test= 15.76;
test= "ali";
در قطعه کد بالا همانطور که مشاهده میکنید، در هر خط به شئ Test تعریف شده از کلاس object یک نوع داده را به عنوان مقدار ورودی ارسال کردهایم، و هیچ مشکلی هم وجود نداشته و کامپایلر اروری را به ما نمیدهد؛ اما در لحظه اجرا برنامه کامپایلر به شئ تعریف شده از کلاس object که همان Test باشد، دستور میدهد تا خود را شبیه به string کند، چرا که آخرین مقداری که به آن ارسال شده، رشته ali است!
اما var چون در لحظه کامپایل شدن، به شکل داده خود تغییر میکند، دیگر نمیتوان جز آن نوع داده از دادههای دیگر برای مقدار دهی آن استفاده کرد:
var test = 5;
test = 26;
test = 100;
test = 1375;
در قطعه کد بالا، چون در لحظه تعریف شئ test از نوع Var مقدار اولیه را عدد 5 قرار دادهایم، پس دیگر شکل var test به نوع داده int تغییر کرده و به غیر از مقادیری از جنس int نمیتوانیم از دادههای دیگر مثل string یا bool و غیره استفاده کنیم.
به طور کلی از Var زمانهایی استفاده میشود که نمیدانیم داده ما از چه جنسی است!
به عنوان مثال یک لیست به شما داده شده تا آن را درون برنامه خود استفاده کنید، اما نمیدانید نوع داده آن لیست از چه نوع دادهای میباشد؛ در نتیجه میتوانید با استفاده از var، به سیستم دستور دهید که شکل داده این لیست را خودت تشخیص و انتخاب کن! (به زبان دیگر میگوییم که کامپایلر خودت هر نوع دادهای که صلاح میدونی برای این متغیر VAr در نظر بگیر!) درنتیجه بعد از تشخیص آن دیگر نمیتوانیم نوع داده آن را تغییر دهیم.
اما واقعیت اینکه object در زمان اجرا شدن به شکل نوع داده خود تغییر میکند هم ممکن است در اکثر اوغات باعث بروز خطاها و باگهایی شود! به این علت که موقع کدنویسی ما به هیچ عنوان کامپایلر متوجه خطا نشده و درنتیجه به برنامه نویس نیز پیامی مبنی بر اخطار یا warning نمیدهد!
به طور کلی از object دیگر استفاده نمیشود (یا حداقل خیلی کم استفاده میشود)، علتش هم اینه که از دسته دادههای ارجاعی هست و تو بخش heap حافظه قرار داره، پس قطعا از سرعت پایینتری نسبت به var برخوردار است.
ولی var چون همان لحظه به شکل دادههایی از جنس simple type تغییر میکند، در نتیجه از دسته Value type ها بوده و در بخش stack حافظه قرار میگیرد که قطعا به همین علت سرعت بالایی دارد.
کلمه کلیدی dynamic
این کلمه دقیقا مثل object است! درنتیجه هرچی توضیح در رابطه با object (به غیر از والد بودن تمامی کلاسها) در بالا برایتان شرح کامل دادهایم، برای dynamic نیز صدق میکند.
تنها تفاوتی که میان object و dynamic وجود دارد، این است که سرعت dynamic ها از object ها بیشتر است!
علت این امر نیز وجود dynamic در دسته Value type ها بوده که همانطور که میدانید، دسته Value type ها در بخش stack حافظه قرار دارند و به همین علت سرعت آنها بسیار بالا است.
جمع بندی
هر زمان که در برنامه خود نیاز داشتیم تا متغیری تعریف شود که در هر لحظه قابلیت تغییر داده را داشته باشد، بهتر است از dynamic، و هر زمان که نمیدانستیم نوع داده آن مقدار مورد نظر ما چیست، از Var استفاده میکنیم.
جهت شرکت در دورههای زبان برنامه نویسی سیشارپ، از کد تخفیف heplc30 استفاده کنید.