با عرض سلام و وقت بخیر خدمت کاربران سایت پی وی لرن ، با یکی دیگر از جلسات دوره کامل آموزش #C در خدمت شما دوستان هستیم . در بخش قبل با انواع ناشناس (anonymous type) در زبان #C آشنا شدید ، در این قسمت قصد داریم به معرفی Dynamic Type در #C و استفاده از داینامیک ها در سی شارپ در این زبان بپردازیم. تا پایان این جلسه همراه ما باشید.
C # 4.0 با (NET 4.5.) یک نوع جدید را معرفی کرد که در زمان کامپایل برنامه از بررسی آن جلوگیری می کند. شما در مورد متغیر var که کامپایلر یک نوع خاص را بر اساس مقدار آن اختصاص میدهد در بخش قبلی آشنا شدید.
کامپایلر از بررسی و چک کردن یک نوع پویا در زمان کامپایل چشم پوشی می کند؛ در عوض، در زمان اجرا نوع آن مشخص می شود.
یک نوع پویا را می توان با استفاده از کلید واژه dynamic تعریف کرد:
1 | dynamic dynamicVariable = 1; |
کامپایلر در اغلب موارد انواع dynamic را در انواع شیء کامپایل می کند. همانند زیر :
1 | object dynamicVariable = 1; |
نوع واقعی dynamic در زمان اجرا مشخص خواهد شد. شما می توانید نوع متغیر پویا را به صورت زیر بررسی کنید:
1 2 3 4 5 6 | static void Main(string[] args) { dynamic dynamicVariable = 1; Console.WriteLine(dynamicVariable.GetType().ToString()); } |
خروجی :
1 | System.Int32 |
متغیر dynamic نوع خود را در زمان اجرا بر اساس مقدار سمت راست اپراتور “=” تغییر می دهد. مثال زیر نشان می دهد که چگونه یک متغیر پویا نوع خود را بر اساس مقدار آن تغییر می دهد:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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()); } |
خروجی :
1 2 3 4 | 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 |
اگر یک شیء کلاس را به نوع پویا اختصاص دهید، کامپایلر نوع متدها و پراپرتی های شیء کلاس را هم بررسی نمی کند. مثال زیر را در نظر بگیرید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 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 را به یک متغیر پویا اختصاص دادیم. در بیانیه دوم در متد Main ما متد FakeMethod را استفاده می کنیم که در کلاس Student وجود ندارد. با این حال، کامپایلر خطایی برای FakeMethod نمی دهد، زیرا متغیر را برای نوع پویا بررسی نمی کند ، ولی در ادامه یک استثناء زمان اجرا برای آن را به صورت زیر دریافت خواهید کرد.
یک متد می تواند پارامترهای نوع پویا داشته باشد تا بتواند هر نوع پارامتر را در زمان اجرا بپذیرد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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); } } |
خروجی :
1 2 3 4 5 | Hello World!! 100 100.50 True 01-01-2014 10:10:50 |
اگر یک متد یا پراپرتی وجود نداشته باشد، در زمان اجرا یک استثناء برگردانده خواهد شد.
در این بخش با dynamic type ها در زبان #C آشنا شدید ، در قسمت بعد این آموزش شما را با نحوه تعریف و مقدار دهی اشیاء (Object Initializer Syntax) در این زبان آشنا خواهیم کرد.