בפרק הקודם למדנו על Interpolated Strings היום נלמד על Null-conditional Operators

    כשעובדים עם משתנים מסוגים שיכולים להכיל null, צריך תמיד לבדוק האם יש בהם ערך לפני שנבצע עליהם פעולות, קוד לדוגמה יכול להיות כזה

    Code Snippet
    static void Work(Customer[] customers)
    {
        if (customers != null)
        {
            Customer c = customers[0];

            if (c != null && c.Orders != null)
            {
                int res = c.Orders.Length;
            }
        }
    }

    קוד דומה לזה יהיה כשנחזיק event שלנו ונרצה להרים אותו, נכתוב בדרך כלל משהו כזה

    Code Snippet
    static void OnMyEvent()
    {
        if (MyEvent != null)
        {
            MyEvent(this, EventArgs.Empty);
        }
    }

     

    כשנעבוד עם nullable types יש קיצור דרך בעזרת ??

    Code Snippet
    int? res = GetValue();

    int data = res ?? 10;

    אך זה כמובן ספציפית לעבודה עם nullable

    החידוש בשפה זה היכולות לכתוב קוד כזה:

    Code Snippet
    static void Work(Customer[] customers)
    {
        int? length = customers?.Length;
        Customer first = customers?[0]; 
        int? count = customers?[0]?.Orders?.Count(); 
    }

    אחרי כל משתנה או אינדקס של מערך ניתן לכתוב ? ובמידה והערך שחוזר הינו null, הקוד מימין אליו לא ימשיך לרוץ, בצורה זו אנחנו יכולים לחסוך מספר די מכובד של שורות קוד, כמו כן הדוגמא של זריקת אירוע יכולה להיראות כך:

    Code Snippet
    static void OnMyEvent()
    {
        MyEvent?.Invoke(this, EventArgs.Empty);
    }

     

    חשוב לציין, שהקוד עם ? הוא רק לזמן קומפייל, ואין לזה שום משמעות לזמן ריצה, הקוד מהדוגמה הקודמת (של ה – Work) ייראה כך אחרי קופילצייה

    Code Snippet
    private static void Work(Customer[] customers)
    {
        int? nullable;
        int? nullable1;
        Customer customer;
        int? nullable2;
        if (customers != null)
        {
            nullable1 = new int?((int)customers.Length);
        }
        else
        {
            nullable = null;
            nullable1 = nullable;
        }
        if (customers != null)
        {
            customer = customers[0];
        }
        else
        {
            customer = null;
        }
        if (customers != null)
        {
            Customer customer1 = customers[0];
            if (customer1 != null)
            {
                int[] orders = customer1.Orders;
                if (orders != null)
                {
                    nullable2 = new int?(((IEnumerable<int>)orders).Count<int>());
                }
                else
                {
                    nullable = null;
                    nullable2 = nullable;
                }
            }
            else
            {
                nullable = null;
                nullable2 = nullable;
            }
        }
        else
        {
            nullable = null;
            nullable2 = nullable;
        }
    }