با استفاده از کلمه dynamic در سی شارپ میتوان متغیر هایی را تعریف کرد که نوع آنها در زمان اجرا مشخص شوند (نه در زمان کامپایل). در این فصل با نوع داده ای dynamic در سی شارپ آشنا خواهیم شد.
نوع dynamic
سی شارپ در نسخه چهار به بعد نوع داده ای جدیدی را اضافه کرد که dynamic
نام دارد. نوع متغیر هایی که به وسیله این نوع داده ای مشخص می شوند، در زمان اجرا تعیین خواهد شد (نه در زمان کامپایل). یک نوع داینامیک میتواند به وسیله کلمه کلیدی dynamic
تعریف شود :
dynamic dynamicVariable = 1;
در بیشتر موارد کامپایلر نوع های dynamic
را به نوع object
تبدیل میکند. عبارت بالا به شکل زیر کامپایل خواهد شد :
object dynamicVariable = 1;
نوع واقعی یک متغیر داینامیک در زمان اجرا مشخص میشود. شما میتوانید نوع یک متغیر داینامیک را به شکل زیر بررسی کنید :
static void Main(string[] args)
{
dynamic dynamicVariable = 1;
Console.WriteLine(dynamicVariable.GetType().ToString());
}
خروجی نمونه مثال بالا به شکل زیر است :
System.Int32
یک نوع dynamic
نوع خود را در زمان اجرا بر اساس مقداری که در سمت راست علامت انتساب (=
) قرار میگیرد، مشخص میکند. مثال زیر نشان میدهد که چطور نوع یک متغیر داینامیک با تغییر مقدار انتسابی، تغییر میکند :
static void Main(string[] args)
{
dynamic dynamicVariable = 100;
Console.WriteLine("Dynamic variable value: {0}, Type: {1}",dynamicVariable, dynamicVariable.GetType().ToString());
dynamicVariable = "Hello World!!";
Console.WriteLine("Dynamic variable value: {0}, Type: {1}", dynamicVariable, dynamicVariable.GetType().ToString());
dynamicVariable = true;
Console.WriteLine("Dynamic variable value: {0}, Type: {1}", dynamicVariable, dynamicVariable.GetType().ToString());
dynamicVariable = DateTime.Now;
Console.WriteLine("Dynamic variable value: {0}, Type: {1}", dynamicVariable, dynamicVariable.GetType().ToString());
}
خروجی نمونه مثال بالا به شکل زیر است :
Dynamic variable value: 100, Type: System.Int32 Dynamic variable value: Hello World!!, Type: System.String Dynamic variable value: True, Type: System.Boolean Dynamic variable value: 01-01-2014, Type: System.DateTime
متدها و پروپرتی های یک نوع داینامیک
اگر شما شی ایی از یک کلاس را به یک نوع داینامیک انتساب دهید ، در اینصورت کامپایلر درستی نام متد ها و پروپرتی های نوع داینامیک را در زمان کامپایل بررسی نخواهد کرد. مثال زیر را در نظر بگیرید :
public class Student
{
public int StudentID { get; set; }
public string StudentName { get; set; }
public int Age { get; set; }
public int StandardID { get; set; }
public void DisplayStudentDetail()
{
Console.WriteLine("Name: {0}", this.StudentName);
Console.WriteLine("Age: {0}", this.Age);
Console.WriteLine("Standard: {0}", this.StandardID);
}
}
class Program
{
static void Main(string[] args)
{
dynamic dynamicStudent = new Student();
dynamicStudent.FakeMethod();
}
}
در مثال بالا شی از نوع Student
را به یک نوع داینامیک انتساب داده ایم. سپس متدی به نام ()FakeMethod
که درکلاس Student وجود ندارد را از شی مورد نظر فراخوانی کرده ایم. با این که ()FakeMethod
متدی از کلاس Student نیست ، ولی خطایی را در زمان کامپایل دریافت نخواهیم کرد. بلکه این خطا در زمان اجرا به شکل زیر نمایش داده می شود:
نوع dynamic به عنوان پارامتر یک متد
یک متد می تواند شامل نوع dynamic
به عنوان پارامتر باشد. در اینصورت متد مورد نظر میتواند در زمان اجرا هر نوعی را به عنوان پارامتر بپذیرد :
class Program
{
static void PrintValue(dynamic val)
{
Console.WriteLine(val);
}
static void Main(string[] args)
{
PrintValue("Hello World!!");
PrintValue(100);
PrintValue(100.50);
PrintValue(true);
PrintValue(DateTime.Now);
}
}
خروجی نمونه مثال بالا به شکل زیر است :
Hello World!! 100 100.50 True 01-01-2014 10:10:50