English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

دليل أساسي C#

دليل متقدم C#

C#面向对象(OOP)

نوع يمكن أن يكون له قيمة صغيرة أو لا (Nullable)

من المعروف أنه لا يمكن تخصيص null لفئات القيم. على سبيل المثال،int i = null سيتم إلقاء خطأ في الوقت التشغيل.

تم إدخال أنواع الممكن في C# 2.0، مما يسمح لك بتخصيص null لفئات القيم. يمكنك استخدام nullable < t > لتعريف نوع الممكن، حيث T هو نوع.

تعريف نوع الممكن

Nullable<int> i = null;

نوع الممكن يمكنه التعبير عن نطاق القيم الصحيحة لنوع القيمة الأساسية، بالإضافة إلى قيمة فارغة إضافية. على سبيل المثال، nullable < int > يمكن تخصيص أي قيمة من -2147483648 إلى 2147483647 أو قيمة null.

نوع nullable هو مثال على struct System.Nullable < t >.

[Serializable]
public struct Nullable<T> where T : struct
{        
    public bool HasValue { get; }
      
    public T Value { get; }
        
    // إضافات أخرى
}

نوع Int الممكن معادله لنوع int العادي، مع إضافة علامة تعبر عن whether int يحتوي على قيمة (whether هو null) .. والباقي هي سحر المترجم، حيث يعتبر null قيمة صالحة.

static void Main(string[] args)
{
    Nullable<int> i = null;
    if (i.HasValue)
        Console.WriteLine(i.Value); // أو Console.WriteLine(i)
    else
        Console.WriteLine("Null");
}
الإخراج:
Null

إذا تم تخصيص قيمة للعنصر، فإنها ستعود true؛ إذا لم يتم تخصيص أي قيمة أو تم تخصيص قيمة null، فإنها ستعود false.

إذا كان نوع nullable_type.value null أو لم يتم تخصيص أي قيمة، فإن محاولة الوصول إلى القيمة باستخدام nullable_type.value سيؤدي إلى حدوث استثناء في الوقت التشغيل. على سبيل المثال، إذا كان i null، فإن القيمة ستلقي استثناء:

استخدام غير صحيح لنوع القابل للتغيير

إذا كانت غير فارغة استخدامGetValueOrDefault() للحصول على القيمة الفعلية؛ إذا كانت قيمة فارغة، يتم استخدام القيمة الافتراضية. على سبيل المثال:

static void Main(string[] args)
{
    Nullable<int> i = null;
    Console.WriteLine(i.GetValueOrDefault()); 
}

بناء الجملة القصيرة لنوع القابل للتغيير

يمكنك استخدام فائدة '؟' لتقليل الجملة، مثل int?، long? بدلاً من استخدام Nullable <T>.

int? i = null;
double? D = null;

فائدة الجمع مع القيمة الفارغة (??)

استخدم فائدة '??' لتخصيص النوع القابل للتغيير لنوع غير قابل للتغيير.

int? i = null;
            
int j = i ?? 0;
Console.WriteLine(j);
الإخراج:
0

في المثال السابق، i هو int قابل للتغيير، إذا تم تخصيصه لـ int غير قابل للتغيير j، فإنه إذا كان i قيمة فارغة، سيقوم بطرح استثناء في وقت التشغيل. لذا، لخفض خطر ظهور الاستثناء، نستخدم فائدة "??"، إذا كان i قيمة فارغة، يتم تخصيص 0 لـ j.

using System;
namespace CalculatorApplication
{
   class NullablesAtShow
   {
         
      static void Main(string[] args)
      {
         
         double? num1 = null;
         double? num2 = 3.14157;
         double num3;
         num3 = num1 ?? 5.34; // إذا كان num1 قيمة فارغة، فإنه يعود 5.34
         Console.WriteLine("قيمة num3: {0}", num3);
         num3 = num2 ?? 5.34;
         Console.WriteLine("قيمة num3: {0}", num3);
         Console.ReadLine();
      }
   }
}

نتيجة الاكتبار:

قيمة num3: 5.34
قيمة num3: 3.14157

قواعد التخصيص

قواعد التخصيص للنوع القابل للتغيير متطابقة مع قواعد التخصيص للنوع المحدد. إذا تم إعلان نوع قابل للتغيير كمتغير محلي في الدالة، فيجب تخصيص قيمته قبل استخدامها. إذا كان أي ميدان في أي فئة، فسيكون له قيمة فارغة افتراضياً.

على سبيل المثال، اعلن واستخدم النوع int القابل للتغيير دون تخصيص أي قيمة. سيعطي المكتشف التعليمات“استخدام متغير محلي غير مخصص 'i'”الخطأ:

خطأ في التخصيص غير المخصص لنوع يمكن أن يكون فارغًا

في المثال التالي، نوع nullable لـ int هو حقل للصنف، لذلك لن يحدث أي خطأ.

class MyClass
{
    public Nullable<int> i;
}
class Program
{
    static void Main(string[] args)
    {
        MyClass mycls = new MyClass();
        if (mycls.i == null)
            Console.WriteLine("Null");
    }
}
الإخراج:
Null

طريقة مقارنة صنف Nullable

يُعتبر Null أصغر من أي قيمة. لذلك لا يمكن استخدام عمليات التباين في Null. انظر إلى المثال التالي، حيث i لا يقل عن j ولا يزيد عن j ولا يساوي j:

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("غير قادر على المقارنة");
}
الإخراج:
غير قادر على المقارنة

صنف Nullable الثابت هو صنف مساعد لنوع Nullable. يقدم مقارنة أنواع يمكن أن تكون فارغة. كما يحتوي على دالة GetUnderlyingType، التي تعود نوع الأساس لنوع يمكن أن يكون فارغًا.

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");
}
الإخراج:
i < j

خصائص أنواع يمكن أن تكون فارغة

  1. أنواع يمكن أن تكون فارغة يمكن استخدامها فقط مع أنواع القيم.

  2. إذا كان Value null، فإن خاصية Value ستلقي استثناء InvalidOperationException؛ وإلا فإنها تعود القيمة.

  3. إذا كان يحتوي المتغير على قيمة، فإن خاصية HasValue تعود صحيحة؛ إذا كان null، تعود خطأ.

  4. يمكن استخدام عمليات التباين == و != فقط مع أنواع يمكن أن تكون فارغة. لجميع التباينات الأخرى، استخدم صنف Nullable الثابت.

  5. لا يمكن استخدام النوع القابل للتغيير المدمج.Nullable <Nullable <int >> i; سيكون هناك خطأ في وقت التجميع.

 النقاط الرئيسية التي يجب تذكرها

  1. نوع <T> القابل للتغيير يسمح بتوزيع null على النوع القابل للتغيير.

  2. ?العمليات هي لغة مختصرة لنوع القابل للتغيير.

  3. استخدام صفة value للحصول على القيمة في النوع القابل للتغيير.

  4. استخدامHasValueتحقق الصفة ما إذا كانت توزع القيمة علىيمكننوع الفارغ.

  5. الصفة الملكية المطلقة هي صفة مساعدة تستخدم لتحليل النوع القابل للتغيير.