بررسی کاربرد داده های پویا (Dynamic) در #C
جمعه 21 اسفند 1394در این مقاله به بررسی داده های پویا (Dynamic ) می پردازیم و مزایای استفاده از این نوع داده را بیان می کنیم. همچنین تفاوت های مهمی که بین این نوع داده و نوع var وجود دارد را نیز بررسی می کنیم .
داده های پویا (dynamic) همراه با C# 4 در Visual Studio 2010 معرفی شدند. داده های پویا ، در ذات و طبیعت خودشان ، پویا هستند و به مقداردهی اولیه، در زمان تعریف ، نیازی ندارند. ما می توانیم این نوع داده را با استفاده از کلمه ی کلیدی "dynamic" در کدمان تعریف کنیم. یک متغیر از نوع پویا (Dynamic) می تواند همراه با هر نوع داده ای از قبیل Int , float , string و یا object مورد استفاده قرار بگیرد. متغیر های پویا می توانند برای ایجاد Property ها و بازگرداندن مقادیر از یک تابع ، مورد استفاده قرار بگیرند.
مثال :
class Demo { dynamic Data = 12; public int Method(int A, int B) { return (A + B) * Data; } } class Program { static void Main(string[] args) { DemoObj = newDemo(); dynamic value1 = 10; dynamic value2 = 11; dynamic Str = "Your Result Is: "; Console.WriteLine(Str + Obj.Method(value1, value2)); Console.ReadLine(); } }
خروجی به صورت زیر خواهد بود :
اصطلاح "داده های پویا" در زمان اجرا ارزیابی می شوند، این گفته به این معناست که همه ی توابع و متغیرهایی که با کلمه ی کلیدی "dynamic" مشخص شده اند، در زمان کامپایل نادیده گرفته می شوند. کامپایلر ، همه ی اطلاعات مربوط به عبارت ها، مثل نوع آن ها را در خودش نگه می دارد و در زمان اجرا از آن ها برای ارزیابی عبارات ، استفاده می کند.
مثال :
class Demo { dynamic Data = 12; public int Method(int A, int B) { return (A + B) * Data; } } class Program { static void Main(string[] args) { //Obj As A Object of Demo Class dynamicObj = newDemo(); dynamic value1 = 10; dynamic value2 = 11; dynamicStr = "Your Result Is: "; Console.WriteLine(Str + Obj.Method(value1, value2)); //Obj as a String Obj = "Pankaj Kumar Choudhary"; Console.WriteLine(Obj); //Obj as a Integer Obj = 12345; Console.WriteLine(Obj); //Obj as a Float Obj = 123.45; Console.WriteLine(Obj); //Obj as a Boolean Obj = false; Console.WriteLine(Obj); //Obj as a Dictionary Obj = newDictionary < int, String > (); Obj[0] = "Haryana"; Obj[1] = "Rajasthan"; Obj[2] = "Punjab"; Obj[3] = "Goa"; foreach(var index inObj.Keys) { Console.WriteLine(Obj[index]); } Console.ReadLine(); } }
خروجی :
ما می توانیم داده های پویا را تغییر بدهیم. در مثال بالا ما نوع داده ی پویا را int ,float,string ,object مشخص کردیم . سایز داده های پویا ، با مقادیری که برای آن ها مشخص می شود، ارزیابی می شود.
تبدیل نوع داده ها به هم
تبدیل نوع داده ی b/w و همچنین داده ی نوع ضمنی ، بسیار آسان است. این ویژگی به برنامه نویس اجازه می دهد تا بین رفتارهای dynamic و non-dynamic جا به جا شود.
مثال :
class Demo { dynamic Data = 12; public int Method(int A, int B) { return (A + B) * Data; } } class Program { static void Main(string[] args) { //Conversion From Implicit Type To Dynamic Type dynamicObj = new Demo(); dynamic value1 = 10; dynamic value2 = 112.45; dynamicStr = "This is a string"; //Conversion From Dynamic Type To Implicit Type Demodm = Obj; int int_ = value1; double ft = value2; string Str_ = Str; Console.WriteLine(Obj.Method(100, 20)); Console.WriteLine(value1); Console.WriteLine(value2); Console.WriteLine(Str); Console.WriteLine(dm.Method(11, 12)); Console.WriteLine(int_); Console.WriteLine(ft); Console.WriteLine(Str_); Console.ReadLine(); } }
خروجی :
Overload Resolution با Argument هایی از نوع پویا
در صورتی که یک و یا تعداد بیشتری از argument ها در متد Call ، دارای نوع پویا باشند، Overload resolution به جای این که در زمان کامپایل ، اتفاق بیفتد، در زمان اجرا اتفاق می افتد. در مثال زیر در متد main ما دو داده ی پویا را پاس می دهیم. در کلاس Demo ، همه ی argument های متد Call از نوع int (عدد صحیح) هستند ، اما در متد main ما دو داده ی پویا پاس می دهیم که اولین داده ی پویا (value1 ) یک مقدار string است، بنابراین با یک خطا در زمان اجرا مواجه می شویم (به جای زمان کامپایل).
مثال :
class Demo { dynamic Data = 12; public int Call(int A, int B) { return (A + B) * Data; } } class Program { static void Main(string[] args) { dynamic Obj = newDemo(); dynamic value1 = "10"; dynamic value2 = 112; Console.WriteLine(Obj.Call(value1, value2)); Console.ReadLine(); } }
خروجی :
تفاوت بین Var و کلمه ی کلیدی Dynamic
کلمه ی کلیدی var می تواند برای ذخیره سازی هر نوع داده ای به کار برود. کلمه ی کلیدی var نوع داده را در زمان کامپایل می فهمد در حالی که کلمه ی کلیدی dynamic ، نوع داده را در زمان اجرا متوجه می شود. کلمه ی کلیدی var در C# 3.0 معرفی شد و Dynamic در C# 4.0 معرفی گردید.
اجازه بدهید تعدادی از تفاوت های این دو نوع داده را بیان کنیم.
Statically Typed و Dynamically Typed
این به این معنی است که نوع متغیر برای var توسط کامپایلر در زمان کامپایل مشخص می شود ولی نوع متغیر dynamic به وسیله ی کامپایلر در زمان اجرا مشخص می شود. بنابراین نوع داده ی var در زمان کامپایل تشخیص داده می شود و خطا برای متغیر var در زمان کامپایل نشان داده می شود اما برای نوع dynamic ، نوع داده تا زمان اجرا نامشخص است بنابراین خطا در زمان اجرا اتفاق می افتد.
نیاز به مقدار دهی اولیه
برای نوع در زمان تعریف ، نیاز به یک مقدار دهی اولیه نیز داریم. اگر ما یک مقدار برای متغیر var var مشخص نکنیم ، با خطا مواجه خواهیم شد. اما در مورد داده های Dynamic نیاز به مقدار دهی اولیه نداریم.
مقدار دهی دوگانه با داده هایی از نوع متفاوت
ما نمی توانیم نوع داده را برای کلمه کلیدی var عوض کنیم . این گفته به این معناست که اگر در زمان تعریف به آن یک مقدار عدد صحیح(int ) نسبت داده باشیم ، در موارد بعدی نمی توانیم نوع داده ی double,string و یا هر نوع داده ی دیگر را به آن نسبت بدهیم. اگر بخواهیم همچین کاری انجام بدهیم ، کامپایلر خطا می گیرد . در مورد داده های نوع پویا (Dynamic) چنین محدودیت هایی وجود ندارد و ما می توانیم نوع داده های مختلفی را به داده های پویا نسبت بدهیم.
استفاده از داده به عنوان پارامتر برای توابع
ما نمی توانیم کلمه کلیدی var را به عنوان پارامتر برای توابع استفاده کنیم ولی نوع dynamic می تواند به عنوان پارامتربرای هر تابعی مورد استفاده قرار بگیرد.
نوع داده ای که قرار است Return شود (از تابع برگردانده شود)
ما نمی توانیم متدی ایجاد کنیم که یک نوع var به عنوان خروجی برگرداند، ولی می توانیم یک متد ایجاد کنیم که خروجی آن یک نوع پویا (Dynamic ) باشد.
نتیجه گیری
نوع داده ی Dynamic ویژگی خوبی برای استفاده از زبان پویا در زمان اجرای برنامه است. اگر چه ، برنامه نویس باید دقت کند که از نوع داده ی پویا (dynamic ) در زمان و جای مناسب استفاده کند.
- C#.net
- 4k بازدید
- 6 تشکر