با عرض سلام و وقت بخیر خدمت کاربران سایت پی وی لرن ، با دوره کامل آموزش #C در خدمت شما دوستان هستیم . در بخش قبلی در رابطه با Anonymous method ها در زبان #C توضیح دادیم و با آن آشنا شدید . در این بخش به معرفی نوع داده Nullable در #C و ویژگی های انواع Nullable توضیح می دهیم.
همانطور که می دانید، یک نوع داده نمی تواند دارای مقدار Null باشد. به عنوان مثال، int i = null یک خطای زمان کامپایل را برمی گرداند.
#C در نسخه ۲٫۰ انواع nullable را معرفی می کند که به شما امکان می دهد تا از مقدار Null در مقداردهی متغیر ها استفاده کنید. شما می توانید انواع nullable را با استفاده از دستور <nullable <t که T نوع داده است، اعلام کنید:
1 | Nullable<int> i = null; |
نوع بالا nullable می تواند شامل محدوده اعداد صحیح مشخص و یا یک مقدار صفر (Null) باشد. برای مثال، <Nullable <int می تواند هر مقدار بین -۲۱۴۷۴۸۳۶۴۸ و ۲۱۴۷۴۸۳۶۴۷ یا یک مقدار صفر را دریافت کند.
انواع Nullable مواردی هستند که از System.Nullable استفاده می کنند:
1 2 3 4 5 6 7 8 9 | [Serializable] public struct Nullable<T> where T : struct { public bool HasValue { get; } public T Value { get; } // other implementation } |
یک مقدار nullable از نوع int همان عنصر عادی است به علاوه یک پرچم که می گوید که آیا int دارای مقدار هست یا خیر. که کامپایلر در اینصورت “null” را به عنوان یک مقدار معتبر تلقی می کند.
1 2 3 4 5 6 7 8 9 | static void Main(string[] args) { Nullable<int> i = null; if (i.HasValue) Console.WriteLine(i.Value); // or Console.WriteLine(i) else Console.WriteLine("Null"); } |
خروجی :
1 | Null |
اگر به شی مقدار اختصاص داده شده باشد HasValue مقدار true را برمیگرداند؛ اگر مقدار مشخصی برای آن تعیین نشده باشد یا یک مقدار صفر تعیین شده باشد، آن را false می کند.
دسترسی به مقدار با استفاده از NullableType.value بدون بررسی خالی نبودن آن یک استثناء زمان اجرا را برمیگرداند، به عنوان مثال، استفاده از i.Value یک استثناء را برمی گرداند اگر متغیر i دارای مقدار null باشد:
1 2 3 4 5 6 7 8 9 | public class Program { public static void Main() { Nullable<int> i = null; Console.WriteLine(i.Value); //compiler error } } |
با استفاده از متد GetValueOrDefault میتوان بدون خطا مقدار را بدست آورید:
1 2 3 4 5 6 | static void Main(string[] args) { Nullable<int> i = null; Console.WriteLine(i.GetValueOrDefault()); } |
میتوانید بجای دستور <Nullable <int از کد ?int استفاده کنید که دقیقا همان کار را انجام می دهد.
1 2 | int? i = null; double? D = null; |
برای مقداردهی متغیرهای معمولی (non-nullable) بوسیله متغیر های Nullable از ?? استفاده کنید :
1 2 3 4 5 | int? i = null; int j = i ?? 0; Console.WriteLine(j); |
خروجی :
1 |
برای تخصیص دادن مقدار یک متغیر Nullable حتما باید آن را مقداردهی کرده باشید ، کامپایلر در اجرای کدهای زیر به خطای “Use of unassigned local variable ‘i'” برمی خورد:
1 2 3 4 5 6 | static void Main(string[] args) { Nullable<int> i; Console.WriteLine(i); } |
در مثال زیر، یک مقدار nullable از نوع int یک فیلد از کلاس است، بنابراین هیچ خطایی نمی دهد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class MyClass { public Nullable<int> i; } class Program { static void Main(string[] args) { MyClass mycls = new MyClass(); Console.WriteLine(mycls.i); } } |
در هنگام کار با متغیر های nullable درون کلاس ها دقت کنید که آنها درست استفاده شوند زیرا اگر مانند مثال بالا استفاده شوند هیچگونه خطایی دریافت نمی کنید ولی شاید برنامه بدرستی کار نکند.
دقت کنید که مقدار Null کمتر از هر مقدار دیگری است. ولی اپراتورهای مقایسه ای در برابر مقدار Null کار نخواهند کرد. مثال زیر را در نظر بگیرید که i کمتر از j، بزرگتر از j و برابر با j نیست.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | static void Main(string[] args) { int? i = null; int j = 10; if (i < j) Console.WriteLine("i < j"); else if( i > 10) Console.WriteLine("i > j"); else if( i == 10) Console.WriteLine("i == j"); else Console.WriteLine("Could not compare"); } |
خروجی :
1 | Could not compare |
برای اینکه کدها بدرستی کار کند و نتیجه مطلوب حاصل گردد باید از کلاس های کمکی کلاس Nullable استفاده کرد. مانند زیر :
1 2 3 4 5 6 7 8 9 10 11 12 | static void Main(string[] args) { int? i = null; int j = 10; if (Nullable.Compare<int>(i, j) < 0) Console.WriteLine("i < j"); else if (Nullable.Compare<int>(i, j) > 0) Console.WriteLine("i > j"); else Console.WriteLine("i = j"); } |
خروجی :
1 | i < j |
در این بخش با متغیرهای Nullable آشنا شدید ، در بخش بعدی قصد داریم شما را مفهوم همبستگی (Covariance) آشنا کنیم.