در سی شارپ یک value type نمیتواند مقدار null را در خود نگه دارد. گاهی اوقات نیاز است یک متغیر علاوه بر اینکه مقادیر واقعی در محدوده ی نوع خود را نگه میدارد ، بتواند مقدار null را هم در خود ذخیره سازی کند. در این مواقع از نوع های Nullable در سی شارپ استفاده میکنیم.
انواع Nullable
همانطور که میدانید یک value type نمیتواند مقدار null را در خود نگه دارد. برای مثال int i = null
باعث می شود که در زمان اجرا با خطا روبرو شوید. در سی شارپ نسخه ۲ انواع nullable
معرفی شدند که اجازه میدهند مقدار null را به یک متغیر value type انتساب داد. شما می توانید یک نوع nullable را با استفاده از عبارت <Nullable<t
که t
در آن یک نوع است را تعریف کنید :
Nullable<int> i = null;
یک نوع nullable علاوه بر این که دارای محدوده ی داده ای نوع مورد نظر خود است می تواند مقدار null را هم در خود نگه دارد. برای مثال <Nullable<int
علاوه بر اینکه میتواند مقداری بین ۲۱۴۷۴۸۳۶۴۸-
تا ۲۱۴۷۴۸۳۶۴۷
را در خود نگه دارد، میتواند مقدار null را نیز در خود ذخیره کند. انواع Nullable نمونه ای از ساختار <System.Nullable<T
هستند.
به آنها به چشم ساختاری به شکل زیر نگاه کنید :
[Serializable]
public struct Nullable<T> where T : struct
{
public bool HasValue { get; }
public T Value { get; }
// other implementation
}
زمانی که از انواع nullable استفاده می کنید میتوانید از مشخصه value برای اینکه مطمئن شوید مقداری به متغیر انتساب داده شده است ، استفاده کنید. اگر مقداری به متغیر مورد نظر انتساب داده شده باشد value مقدار true
را برمیگرداند در غیر این صورت مقدار بازگشتی false
خواهد بود :
Nullable<int> i = null;
if (i.HasValue)
Console.WriteLine(i.Value); // or Console.WriteLine(i)
else
Console.WriteLine("Null");
}
خروجی نمونه مثال بالا به شکل زیر خواهد بود :
Null
دسترسی به متغیر مورد نظر با استفاده از مشخصه value
در صورتیکه متغیر با null مقدار دهی شده باشد باعث بروز استثنا در برنامه میشود :
برای حل این مشکل از متد ()GetValueOrDefault
استفاده کنید. این متد در صورتی که متغیر شامل مقداری واقعی باشد، مقدار موردنظر را برمی گرداند و در صورتی که مقدار متغیر null باشد مقدار پیش فرض را بر میگرداند :
static void Main(string[] args)
{
Nullable<int> i = null;
Console.WriteLine(i.GetValueOrDefault());
}
در نمونه مثال بالا با توجه به اینکه متغیر حاوی مقدار null است، متد ()GetValueOrDefault
مقدار پیش فرض صفر را برای متغیر i
برخواهد گرداند. خروجی نمونه مثال بالا به شکل زیر است :
0
قاعده نوشتاری مختصر شده برای انواع Nullable
میتوانید از عملگر '?'
به شکل ?int
و ?long
به جای <Nullable<T برای تعریف متغیر های Nullable استفاده نمایید :
int? i = null;
double? D = null;
از عملگر '??'
برای انتساب یک متغیر از نوع Nullable به یک متغیر از نوع non-nullable استفاده کنید :
int? i = null;
int j = i ?? 0;
Console.WriteLine(j);
خروجی نمونه مثال بالا به شکل زیر است :
0
در نمونه مثال بالا i یک متغیر Nullable بوده و اگر بخواهیم آن را به متغیر j که یک non-nullable است انتساب دهیم در زمان اجرا با خطا روبرو میشویم. برای رفع این مشکل از عملگر '??'
استفاده کرده ایم. در این صورت اگر متغیر i حاوی مقدار null باشد، مقدار صفر در متغیر j قرار خواهد گرفت.