در این مقاله، ما در مورد کلاسهای anonymous، نحوه ایجاد آنها و دلیل مفید بودن آنها صحبت میکنیم. علاوه بر این، در مورد nullable type ها و نحوه استفاده از آنها با value type ها و اینکه چه ویژگیهایی با nullable type ها در اختیار ما قرار میگیرد صحبت میکنیم.
این مقاله، سرفصلی از دوره آموزشی زیر میباشد:
- کلاسها و سازنده ها
- ویژگیها
- constant ،Static member ها و Extension Method ها
- Anonymous Type ها و Nullabel Type ها
- ساختارها
- شمارنده ها
- وراثت
- Interface ها
- کلاسهای Abstract
- Generic ها
- Queue, Stack, Hashtable
- Generic List و Dictionary
- Delegate ها
اگر می خواهید محتویات کامل این دوره را ببینید ، می توانید بر روی لینک سطح متوسطه #C کلیک کنید.
برای دانلود سورس، روی لینک سورس Anonymous Type ها و Nullable Type ها در #c کلیک کنید.
ما این مقاله را به قسمتهای زیر تقسیم میکنیم:
کلاسهای Anonymous
یک کلاس anonymous کلاسی است که نام ندارد. این به نظر عجیب می رسد اما گاهی اوقات یک کلاس anonymous می تواند مفید باشد ، به خصوص هنگام استفاده از query expression ها.
بیایید ببینیم که منظور ما از این حرف چیست.
ما میتوانیم به طور ساده با استفاده از کلمه new قبل از بریس باز و بسته، یک آبجکت از کلاس anonymous ایجاد کنیم:
1 |
myAnonymousObj = new { Name = "John", Age = 32 }; |
این آبجکت شامل دو ویژگی Name
و Age
است. کامپایلر به طور ضمنی، نوع ها را بر اساس نوعهای مقادیر آنها به ویژگیها اختصاص می دهد. بنابراین معنی این اساساً این است که ویژگی Name از نوع string و ویژگی Age از نوع int خواهد بود.
اما اکنون می توانیم بپرسیم myAnonymousObj از چه نوعی است؟ و پاسخ این است که ما نمی دانیم که اینجا، کدام قسمت به کلاس های anonymous اشاره میکند. اما این در #C مسئله ای نیست. ما میتوانیم آبجکتمان را با استفاده از کلمه کلیدی var به عنوان یک متغیر نوع ضمنی تعریف کنیم:
1 |
var myAnonymousObj = new { Name = "nesto", Age = 32 }; |
کلمه var باعث میشود که کامپایلر یک متغیر از نوع همان expression که ما برای مقداردهی آن آبجکت استفاده میکنیم ایجاد کند. پس اجازه بدید تا چند مثال از نوعهای شناخته شده را ببینیم:
1 2 3 |
var number = 15; // the number is of type int var word = "example"; //the word is of type string var money = 987.32; //the money is of type double |
ما میتوانیم به ویژگیهای آبجکت anonymous به همان روشی که با آبجکتهای شناخته شده کار میکردیم دسترسی داشته باشیم:
1 |
Console.WriteLine($"The name of myAnonymousObject is {myAnonymousObj.Name}, the age is {myAnonymousObj.Age}"); |
Nullable Type ها
مقدار null برای مقداردهی اولیه reference type ها مفید است. بنابراین منطقی است که مقدار null را به value type اختصاص ندهیم، زیرا null خودش یک reference است.
همانطور که گفته شد، می توانیم ببینیم که عبارت زیر خطا ایجاد می کند:
با این حال، #C یک modifier در اختیار ما میگذارد تا بتوانیم یک value type را از نوع null پذیر تعریف کنیم. برای این کار، ما میتوانیم از علامت ? برای تعیین اینکه value type یک نوع null پذیر است استفاده کنیم:
1 |
int? number = null; |
در این حالت، ما همچنان میتوانیم یک مقدار integer را به nullable value type مان تخصیص دهیم:
1 2 3 4 5 |
int? number = null; int another = 200; number = 345; number = another; |
این حالت در کل معتبر است. اما اگر بخواهیم مقدار نوع nullable مان را به متغیری از نوع int تخصیص دهیم به مشکل برخواهیم خورد:
1 2 3 4 |
int? number = null; int another = 200; another = number; //this is the problem |
خب این مشکل منطقی است. چرا که ما اینجا این را لحاظ کردیم که متغیر number ممکن است شامل null باشد در صورتی که متغیر another اصلا نمیتواند مقدار null بپذیرد.
ویژگیهای Nullable Type ها
nullable type ها چند ویژگی را در اختیار ما میگذارد که در حین کار بر روی پروژه میتواند برای ما مفید باشد. ویژگی HasValue که تعیین میکند که آیا nullable type شامل یک مقدار است یا اینکه null است. ویژگی Value در صورتی که نوع nullable ما درونش null نباشد مقدار درون آن را به ما میدهد:
1 2 3 4 5 6 7 8 9 10 11 |
int? number = null; number = 234; //comment this line to print out the result from the else block if(number.HasValue) { Console.WriteLine(number.Value); } else { Console.WriteLine("number is null"); } |
نتیجه گیری
در این مقاله ما یاد گرفتیم:
- نحوه استفاده از کلاسهای anonymous
- nullable type ها چه چیزهایی هستند
- در مورد ویژگیهای nullable type ها
در مقاله بعدی، در مورد ساختارها در #C صحبت میکنیم.