بررسی کاربرد داده های پویا (Dynamic) در #C

جمعه 21 اسفند 1394

در این مقاله به بررسی داده های پویا (Dynamic ) می پردازیم و مزایای استفاده از این نوع داده را بیان می کنیم. همچنین تفاوت های مهمی که بین این نوع داده و نوع var وجود دارد را نیز بررسی می کنیم .

بررسی کاربرد داده های پویا (Dynamic) در #C

داده های پویا (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 ) در زمان و جای مناسب استفاده کند.

آموزش سی شارپ

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

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

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

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