أنواع القيم القابلة للقيمة الفارغة
int? وبنية Nullable
أنواع القيم القابلة للقيمة الفارغة درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 4 دروس في المجموع.
لماذا الأنواع القيمية القابلة لـ null؟
تحمل الأنواع القيمية مثل int وbool وDateTime قيمةً دائمًا. إذ تكون القيمة الافتراضية لـ int هي 0، ولا تعني أبدًا «لا توجد قيمة».
تحتاج أحيانًا إلى تمثيل بيانات مفقودة، مثل حقل لم يُجب عنه في استبيان أو عمود فارغ في قاعدة بيانات. وتتيح الأنواع القيمية القابلة لـ null أن يحمل النوع القيمي أيضًا القيمة null.
التعريف باستخدام int؟
أضف ? بعد النوع القيمي لجعله قابلًا لـ null. ويمكن لـ int? أن يحمل أي عدد صحيح أو القيمة null.
هذه هي الطريقة الأكثر شيوعًا لكتابة الأنواع القيمية القابلة لـ null في شيفرة C# اليومية.
int? age = null;
int count = 5;
age = count;
System.Console.WriteLine(age);Nullable<T> من الداخل
صيغة ? هي اختصار. فالنوع int? مطابق تمامًا للنوع Nullable<int>.
إن Nullable<T> بنية تغلّف نوعًا قيميًا وتضيف علامة تتتبع ما إذا كانت هناك قيمة موجودة.
Nullable<int> a = 10;
int? b = 10;
System.Console.WriteLine(a == b);HasValue وValue
يكشف كل نوع قابل لـ null عن خاصيتين. تكون HasValue مساويةً لـ true عند وجود قيمة، وتعيد Value القيمة الأساسية.
تؤدي قراءة Value عندما تكون HasValue مساويةً لـ false إلى رمي InvalidOperationException، لذا تحقّق أولًا.
int? score = 42;
if (score.HasValue)
{
System.Console.WriteLine(score.Value);
}مثال كامل
إليك برنامجًا كاملًا. يعيّن قيمة، ويفحص HasValue، ثم يطبع النتيجة.
شغّله لترى كيف يتصرف النوع القيمي القابل لـ null عندما يحتوي فعليًا على بيانات.
using System;
class Program
{
static void Main()
{
int? temperature = 21;
if (temperature.HasValue)
Console.WriteLine("Temp: " + temperature.Value);
else
Console.WriteLine("No reading");
}
}عندما تكون القيمة Null
يؤدي إسناد null إلى جعل HasValue يعيد false. ثم يُنفّذ الفرع else.
يتيح لك هذا النمط التعامل بأمان مع القراءات الاختيارية دون التسبب في انهيار البرنامج.
using System;
class Program
{
static void Main()
{
int? temperature = null;
if (temperature.HasValue)
Console.WriteLine(temperature.Value);
else
Console.WriteLine("No reading");
}
}GetValueOrDefault
تعيد GetValueOrDefault() القيمة إذا كانت موجودة، وإلا فتعيد القيمة الافتراضية لذلك النوع، مثل 0 بالنسبة إلى int.
يمكنكم أيضًا تمرير قيمة احتياطية من اختياركم: تعيد GetValueOrDefault(100) القيمة 100 عندما تكون القيمة null.
int? quantity = null;
int result = quantity.GetValueOrDefault(100);
System.Console.WriteLine(result);التحويل الضمني إلى نوع قابل لـ null
يتحوّل int العادي تلقائيًا إلى int?، لأن كل قيمة عادية تُعد أيضًا قيمة قابلة لـ null صالحة.
أما التحويل العكسي فليس تلقائيًا: فالانتقال من int? إلى int يتطلب تحويلًا صريحًا أو قيمة احتياطية، لأن القيمة القابلة لـ null قد تكون null.
int plain = 7;
int? wrapped = plain;
int back = (int)wrapped;
System.Console.WriteLine(back);الأنواع القابلة لـ null مع أنواع القيم الأخرى
يمكن استخدام ذلك مع أي نوع قيمة: bool? وdouble? وDateTime?، وحتى الهياكل المخصصة.
يمتلك bool? ثلاث حالات: true وfalse وnull، وهذا مفيد للأسئلة التي لم تُجب عنها بنعم أو لا.
bool? agreed = null;
double? price = 9.99;
System.Console.WriteLine(agreed.HasValue);
System.Console.WriteLine(price.Value);الأنواع المرجعية قابلة لـ null أصلًا
يمكن أن تكون الفئات مثل string والمصفوفات بقيمة null أصلًا، لذلك لا تحتاج إلى غلاف Nullable<T>.
أما الرمز ? مع الأنواع المرجعية، مثل string?، فله معنى مختلف: فهو تعليق توضيحي يشير إلى قابلية النوع المرجعي لـ null، وليس بنية Nullable<T>.
مقارنة القيم القابلة لـ null
تعمل المقارنات، لكن تذكّروا أن null يتصرف بطريقة خاصة. تكون قيمتا null متساويتين، وتعيد أي مقارنة ترتيبية تتضمن null القيمة false.
لذلك تكون null < 5 مساوية لـ false، وكذلك تكون null > 5 مساوية لـ false.
int? x = null;
System.Console.WriteLine(x < 5);
System.Console.WriteLine(x == null);اختبار سريع
اختبروا مدى فهمكم لأنواع القيم القابلة لـ null.
مراجعة
تتيح أنواع القيم القابلة لـ null لأنواع القيم الاحتفاظ بالقيمة null أيضًا. اكتبوا هذه الأنواع مثل int?، وهي مكافئة لـ Nullable<int>.
استخدموا HasValue للتحقق من وجود قيمة، وValue لقراءتها عند وجودها فقط، وGetValueOrDefault() للحصول على قيمة احتياطية آمنة. أما الأنواع المرجعية فهي قابلة لـ null بطبيعتها.
الأسئلة الشائعة
هل درس «أنواع القيم القابلة للقيمة الفارغة» مجاني؟
نعم — نص درس «أنواع القيم القابلة للقيمة الفارغة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.
ماذا ستتعلم في «أنواع القيم القابلة للقيمة الفارغة»؟
int? وبنية Nullable تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟
لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «أنواع القيم القابلة للقيمة الفارغة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟
نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- أنواع القيم القابلة للقيمة الفارغة
- العامل Null-Conditional
- عوامل Null-Coalescing
- الحماية من القيم الفارغة