آموزش انواع داده های تهی پذیر (Nullable) در سی شارپ (و نکات)

در زبان سیشارپ، متغیرها مثل جعبههایی هستند که اطلاعات را در خود نگه میدارند. انواع دادههای تهیپذیر (Nullable) به بیان ساده یعنی جعبههایی که اجازه دارند کاملاً خالی باشند.
مشکل متغیرهای معمولی چیست؟
انواع دادههای اصلی در سیشارپ (مثل اعداد int یا مقادیر منطقی bool) همیشه باید یک مقدار درون خود داشته باشند.
برای مثال، اگر یک متغیر عدد صحیح (int) تعریف کنید و مقداری به آن ندهید، سیستم به طور خودکار عدد 0 را در آن قرار میدهد. اما گاهی اوقات عدد صفر با «خالی بودن» فرق دارد.
یک مثال کاربردی در نرمافزارهای بانکی
فرض کنید در حال توسعه بخش تسهیلات یک سیستم بانکی هستید و میخواهید «امتیاز اعتباری» یک مشتری را ذخیره کنید.
-
اگر متغیر شما یک
intمعمولی باشد و سیستم هنوز امتیاز مشتری را محاسبه نکرده باشد، مقدار پیشفرض0در آن قرار میگیرد. -
در دنیای بانکداری، امتیاز
0یعنی این مشتری سابقه مالی بهشدت بدی دارد! در حالی که منظور ما این نبود؛ ما فقط هنوز امتیازی برای او ثبت نکرده بودیم.
اینجا همان جایی است که دادههای Nullable به کمک شما میآیند. آنها تفاوت بین «عدد صفر» و «عدم وجود اطلاعات» را مشخص میکنند.
نحوه ساخت یک متغیر تهیپذیر
برای اینکه به سیشارپ بگویید یک متغیر میتواند کاملاً خالی (یا در اصطلاح برنامهنویسی null) باشد، فقط کافی است یک علامت سوال (?) به انتهای نوع داده اضافه کنید:
// یک متغیر معمولی که نمیتواند خالی باشدint normalScore = 0; // یک متغیر تهیپذیر که الان کاملاً خالی استint? creditScore = null;چگونه با متغیرهای Nullable کار کنیم؟
وقتی جعبه شما میتواند خالی باشد، قبل از استفاده از محتویات آن باید چک کنید که آیا اصلاً چیزی داخلش هست یا نه. سیشارپ برای این کار دو ویژگی مهم در اختیار شما میگذارد:
-
ویژگی HasValue: بررسی میکند که آیا جعبه پر است (True) یا خالی (False).
-
ویژگی Value: مقدار داخل جعبه را به شما میدهد (فقط زمانی باید از این استفاده کنید که مطمئن باشید جعبه خالی نیست).
نمونه کد بررسی:
int? creditScore = null;if (creditScore.HasValue) { // اگر خالی نبود، مقدار آن را چاپ کن Console.WriteLine("امتیاز مشتری: " + creditScore.Value);} else { // اگر خالی بود، این پیام را چاپ کن Console.WriteLine("امتیاز اعتباری هنوز محاسبه نشده است.");}آموزش با توضیحات جزئی و مفصل تر
Null در واقع به معنای پوچ و تهی می باشد – متغیری است که مقدار ندارد. در این قسمت از آموزش مان؛ ممکن است با داده هایی روبه رو شده باشید که مقداردهی اولیه نشدند. شما همچنین می دانید که باید همیشه قبل از دسترسی به یک متغیر؛ باید از این موضوع اطمینان حاصل کنید که آن متغیر، مقداری دارد. در غیر این صورت؛ احتمالاً با یک NullReferenceException مواجه خواهید شد.
این داده های Null مشخصاً زمانی که با اشیاء و رشته های خودتان کار می کنید؛ حائز اهمیت می باشد. از سوی دیگر؛ زمانی که با اعدادی مانند اعداد صحیح کار می کنید؛ خواهید دید که این داده ها همیشه یک مقدار (پیش فرض) دارند. برای یک عدد صحیح مقدار ذخیره/ پیشفرض ۰ (صفر) می باشد؛ که هرگز نباید با NULL اشتباه گرفته شود – آنها اصلاً شبیه هم نیستند؛ حتی اگر برخی از زبان های برنامه نویسی تایپ شده غیر استاتیک با آنها یکسان رفتار کنند- زیرا ۰ یک عدد است و Null چیزی نیست.
پایگاه داده SQL Server رو قورت بده! بدون کلاس، سرعت 2 برابر، ماندگاری 3 برابر، پولسازی بلافاصله ... دانلود:
بنابراین؛ بنابراین اگر در شرایطی قرار گرفته اید که می خواهید یک عددی را تعریف کنید که نشان دهنده ی یک مقدار NULL / تعریف نشده باشد؛ ممکن است ندانید که باید چه کار کنید؛ زیرا شما نمی توانید مقدار null را به یک متغیر عدد صحیح تخصیص دهید. مگر این که عدد صحیح به صورت تهی پذیر (nullable) تعریف شده باشد – یک ساختار ویژه زبان برنامه نویسی که برای موقعیت هایی مشابه این ساخته شده است. در اینجا مثالی برای توضیح این تفاوت آورده شده است:
int notNullable = null; // Will cause an error from the compiler
int? nullable = null; // Just fine – it’s nullable!
این نوع کد نویسی برای به اصطلاح انواع مقادیر مانند اعداد صحیح، اعداد ممیزی شناور، متغیرهای بولین و ساختارها مجاز است. رشته ها و اشیاء از سوی دیگر انواع مرجع هستند و نمی توان آنها را به صورت تهی پذیر تعریف کرد؛ زیرا آنها به صورت پیش فرض خود nullable هستند.
بررسی یک تهی پذیری برای null
بنابراین؛ اکنون که شما یک متغیری تعریف کرده اید که می تواند null باشد؛ بررسی اینکه آیا این مورد کاملاً تهی می باشد یا خیر، مهم است. شما می توانید این کار را از دو طریق انجام دهید: کافی است متغیر را با انواع دیگر کلید واژه هایnull مقایسه کنید، یا از ویژگی HasValue استفاده کنید که یک شیء null از سیستم System.Nullable به ارث می برد. به مثال زیر توجه کنید:
int? nullable = null;
if (nullable == null)
Console.WriteLine(“It’s a null!”);
if (!nullable.HasValue)
Console.WriteLine(“It’s a null!”);
نتیجه مشابه است؛ بنابراین هرکدام از این متدها که برای تان ساده تر و قابل درک تر است را مورد استفاده قرار دهید. از آنجایی که مقدار ما اکنون می تواند تهی باشد؛ شما باید همیشه قبل از استفاده از آن؛ این مورد را بررسی کنید؛ در غیر این صورت ممکن است با خطا در برنامه نویسی مواجه شوید.
استفاده از مقدار یک nullable
یک شیء تهی پذیر از System.Nullable ، ویژگی Value را نیز به ارث می برد. این امر می تواند برای باز به دست آوردن مقدار حقیقی شیء تهی پذیر استفاده شود. با این حال، برای عملیاتی که یک مقایسه ساده را انجام دهد؛ برای مثال استفاده از اپراتورهای == و !=؛ سی شارپ به شما اجازه می دهد ویژگی Value را حذف کنید و مستقیماً شیء تهی پذیر را مقایسه نمایید. به عبارت دیگر؛ هردو این مثال ها؛ همان کار را انجام می دهد:
int? nullable = 42;
if (nullable.Value == 42)
Console.WriteLine(“It’s 42!”);if (nullable == 42)
Console.WriteLine(“It’s 42!”);
اشیاء Nullable همیشه از انواع داده های پایه مانند اعداد صحیح می آید؛ همان طور که در مثال قبلی آمد. در حالی که این نوع داده ها ممکن است یک مقدار پیش فرض داشته باشد؛ مقدار پیشفرض تهی پذیر؛ همیشه تهی است. به این دلیل است که همان طور که پیشتر گفتیم؛ شما باید قبل از این که سعی کنید که از یک مقدار استفاده کنید؛ مرجع تهی بودن آن را بررسی کنید. با این حال، یک نوع nullable ؛ متد کمک کننده بسیار جالبی را به ارث می برد که شما می توانید استفاده کنید: ()GetValueOrDefault. این متد؛ مقدار شیء nullable را باز می گرداند؛ مگر این که مقدار آن تهی باشد؛ در این حالت مقدار پیش فرض نوع واقعی را برمی گرداند. بنابراین، برای یک عدد صحیح Nullable، ۰ را برمی گرداند ، برای یک متغیر بولین nullable، عبارت false باز می گردد و غیره. این به شما امکان می دهد تا هم چک کردن و هم بازیابی مقدار را طی بیان یک عبارت واحد انجام دهید:
if ((nullable.HasValue) && (nullable.Value == 42))
Console.WriteLine(“It’s 42!”);if(nullable.GetValueOrDefault() == 42)
Console.WriteLine(“It’s 42!”);
همان طور که مشاهده می کنید؛ مثال دوم در مورد بالا؛ کوتاه تر و خواندن آن ساده تر است؛ در حالی که هر دو مثال یک کار مشابه را انجام می دهند.
خلاصه
انواع مقادیر در سی شارپ، مانند اعداد صحیح و متغیرهای بولین؛ همه یک مقدار پیشفرض دارند. اگر می خواهید با این داده ها کار کنید ، به عنوان مثال از آنجا که باید بین ۰ و null تفاوت قائل شوید، یا به این دلیل که باید بدانید کاربر خودش فعالانه “false” را برای چیزی انتخاب کرده است یا این که متغیر فقط مقدار پیش فرض false را در خود نگه داشته است، می توانید متغیر را با اضافه کردن یک ? (علامت سؤال) به عنوان پسوند؛ به صورت تهی پذیر درآورید.

