آموزش انواع داینامیک داده ها در سی شارپ
در نسخه ۴ سی شارپ؛ مایکروسافت نوع جدیدی از داده ها را معرفی کرده است: نوع داینامیک(dynamic). این داده ها در واقع نوعی استاتیک هستند؛ اما بر خلاف دیگر انواع استاتیک؛ اعضای (بالقوه) اشیاء دینامیک برای کامپایلر بررسی نمی شود. این موضوع برخی مزایای زبان های تایپ شده به صورت هفتگی/دینامیک را در اختیار شما قرار می دهد؛ در حالی که مزایای زبان هایی که در تمام موارد؛ قویاً تایپ شده است را نیز حفظ می کند.
بیان یک نوع داده ی داینامیک مشابه تعریف دیگر داده ها است – فقط کافی است به جای نوع داده از کلید واژه dynamic استفاده شود:
dynamic d1;
dynamic d2 = “A string”;
dynamic d3 = 42;
اکنون سه شیء متفاوت را تعریف کرده اید؛ اولین آنها در واقع یک شیء تهی (null) می باشد که هیچ مقداری ندارد؛ در حالی که دومی یک رشته و سومی یک عدد صحیح ست. مفسر بر اساس آنچه که به متغیرها تخصیص داده اید؛ در مورد این امر به صورت اتوماتیک؛ هنگام اجرای برنامه تصمیم می گیرد. که این درواقع به آن معنا است که کامپایلر بررسی نخواهد کرد که شما با این نوع متغیرها چه کرده اید. این موضوع را می توانید در مثال بعدی مشاهده کنید:
dynamic d1;
dynamic d2 = “A string”;
dynamic d3 = 42;
Console.WriteLine(d2.Length);
Console.WriteLine(d3.Length);
رشته ها یک ویژگی length (طول) دارند؛ که تصمیم می گیرد طول رشته چقدر باید باشد؛ اما یک عدد صحیح از این ویژگی برخوردار نیست. من سعی کرده ام که از این ویژگی در هر دو متغیر استفاده کنم و کامپایلر نیز در این مورد خطایی اعلام نکرده است – اگر این متغیرها به صورت یک رشته و یک عدد صحیح تعریف شده بودند؛ کامپایلر حتماً خطا می گرفت. اما از آنجایی که این داده ها به صورت داینامیک بیان شده اند؛ کامپایلر فقط کدنویسی را کامپایل کرده و اجرا می نماید. با این حال؛ به محض این که مفسر برنامه به خط آخر می رسد؛ یک خطا رخ خواهد داد؛ زیرا بدیهی است که شما نمی توانید به آن ویژگی دست یابید که اصلاً وجود ندارد.
این مثال همچنین خطر استفاده از انواع داده های دینامیک را نشان می دهد؛ شما باید از آنچه می خواهید انجام دهید آگاهی کامل داشته باشید و مطمئن باشید که همه چیز را با املای درست نوشته اید و نیز این که ویژگی ها و متدهای صحیحی را فراخوانی کرده اید؛ زیرا کامپایلر کار شما را دوباره چک نمی کند.
یک شیء دینامیک
یک کلید واژه ی دینامیک؛ می تواند البته برای انواع پیچیده تری از اعداد صحیح و رشته ها به کار گرفته شود. یک مثال بسیار خوب در این زمینه، هنگامی است که بخواهید مانند زیر؛ یک شیء بی نام را در کد نویسی لحاظ کنید.
dynamic user = new
{
Name = “John Doe”,
Age = 42
};
Console.WriteLine(user.Name + ” is ” + user.Age + ” years old”);
پایگاه داده SQL Server رو قورت بده! بدون کلاس، سرعت 2 برابر، ماندگاری 3 برابر، پولسازی بلافاصله ... دانلود:
این به شما اجازه می دهد که یک شیء را بدون این که ابتدا یک کلاس را برای آن تعریف کنید؛ ایجاد نمایید. کلیدواژه دینامیک را می توان برای نگه داشتن آن به کار گرفت، البته کلید واژه var را نیز می توان استفاده نمود که در بیشتر موقعیت ها مناسب است.
چون نوع داده ها داینامیک است؛ ممکن است این طور فکر کنید که مشابه زیر، می توانید فقط در ادامه ویژگی ها را به آن اضافه کنید:
dynamic user = new
{
Name = “John Doe”,
Age = 42
};
user.HomeTown = “New York”;
از آنجایی که روی داده های داینامیک، زمان کامپایل شدن کدنویسی کاری انجام نمی شود؛ این کد در واقع اجرا می شود؛ زیرا کامپایلر در واقع؛ وجود ویژگی HomeTown را تأیید نمی کند؛ اما به محض این که به خط آخر برسد؛ یک خطا رخ می دهد. در حالی که نوع داینامیک بسیار داینامیک می باشد؛ به شما اجازه نمی دهد که به صورت دینامیک ویژگی هایی را به آن اضافه کنید. برای این منظور، شما می توانید از یک ExpandoObject استفاده کنید که در مقاله بعدی بحث و بررسی می شود.
نوع تغییر دهنده
یک متغیر که به صورت داینامیک تعریف می شود؛ به هیچ عنوان بدون نوع نیست. در عوض، سی شارپ؛ با آن به صورت شیئی رفتار می کند که شما می خواهید به آن تخصیص بدهید. در اولین مثالی که زدیم؛ مشاهده کردید که چگونه می توانیم یک متغیر را به صورت داینامیک بیان کنیم و یک رشته یا یک عدد صحیح را به آن اختصاص دهیم و سپس از ویژگی هایی استفاده کنیم که به این نوع داده ها تعلق دارد. شما می توانید با این حال، به سادگی نوع متغیر داینامیک داده را تغییر دهید- فقط کافی است یک مقدار جدید را به آن تخصیص دهید. در ادامه می توانید مثالی از این دست را مشاهده کنید:
dynamic user = new
{
Name = “John Doe”,
Age = 42
};
Console.WriteLine(user.GetType() + “: ” + user.Name + ” is ” + user.Age + ” years old”);
user = “Jane Doe”;
Console.WriteLine(user.GetType() + “: String.Length = ” + user.Length);
توجه کنید که چگونه از متغیر داینامیک user استفاده می کنیم: ابتدا یک شیء بی نام را نگه می دارد و سپس یک رشته ساده را در عوض به آن اختصاص می دهیم. ما آن را با استفاده از متد ()GetType تأیید می کنیم که در اشیاء سی شارپ یافت شده است و در هر دو مورد؛ به ویژگی هایی دست می یابیم که در داده هایی که در حال حاضر داریم موجود است (ابتدا ویژگی های Name/Age (نام/سن) شیء ناشناس و سپس ویژگی طول را در اشیاء رشته پیدا خواهیم کرد).
خلاصه
کلید واژه Dynamic به شما اجازه می دهد از متغیرهایی استفاده کنید که نوع آنها مشخص نیست؛ در عوض؛ آنها به عنوان نوعی از داده ها عمل می کنند که به آنها اختصاص داده می شود. شما می توانید به سادگی یک مقدار جدید به متغیر داینامیک تخصیص دهید؛ و اگر نوع مقداری که به آن تخصیص می دهید؛ مشابه مقداری که در حال حاضر دارد، نباشد؛ متغیر دینامیک به سادگی نوع داده را تغییر می دهد.
متغیرهای داینامیک توسط کامپایلر بررسی نمی شوند و به شما اجازه می دهند که به ویژگی هایی دسترسی پیدا کنید که می توانند حاضر باشند یا نباشند. این امر باعث می شود که آنها خیلی انعطاف پذیر باشند؛ همچنین باعث می شود که برنامه های شما نسبت به خطاها؛ آسیب پذیرتر باشد. به همین دلیل، به ویژه در موقعیت هایی که بدون استفاده از آن؛ نمی توانید آنچه را که می خواهید به انجام برسانید؛ ممکن است بخواهید استفاده از کلیدواژه های داینامیک را محدود کنید. نمونه هایی که استفاده از کلیدواژه داینامیک می تواند کارآمد باشد؛ برای COM interop و تعامل با داده هایی است که فرمت های JSON و XML دارند.
سلام ایا می توان بدون کلمه دینامیک داده ها را در کامپایلر صحت سنجی کرد و بعدا انها را بصورت دینامیک نوشت تا خطای run time یا خطا در زمان اجرا ایجاد نشود ؟
پاسخ