בפרק הקודם למדנו על Interpolated Strings היום נלמד על Null-conditional Operators
כשעובדים עם משתנים מסוגים שיכולים להכיל null, צריך תמיד לבדוק האם יש בהם ערך לפני שנבצע עליהם פעולות, קוד לדוגמה יכול להיות כזה
{
if (customers != null)
{
Customer c = customers[0];
if (c != null && c.Orders != null)
{
int res = c.Orders.Length;
}
}
}
קוד דומה לזה יהיה כשנחזיק event שלנו ונרצה להרים אותו, נכתוב בדרך כלל משהו כזה
{
if (MyEvent != null)
{
MyEvent(this, EventArgs.Empty);
}
}
כשנעבוד עם nullable types יש קיצור דרך בעזרת ??
int data = res ?? 10;
אך זה כמובן ספציפית לעבודה עם nullable
החידוש בשפה זה היכולות לכתוב קוד כזה:
{
int? length = customers?.Length;
Customer first = customers?[0];
int? count = customers?[0]?.Orders?.Count();
}
אחרי כל משתנה או אינדקס של מערך ניתן לכתוב ? ובמידה והערך שחוזר הינו null, הקוד מימין אליו לא ימשיך לרוץ, בצורה זו אנחנו יכולים לחסוך מספר די מכובד של שורות קוד, כמו כן הדוגמא של זריקת אירוע יכולה להיראות כך:
{
MyEvent?.Invoke(this, EventArgs.Empty);
}
חשוב לציין, שהקוד עם ? הוא רק לזמן קומפייל, ואין לזה שום משמעות לזמן ריצה, הקוד מהדוגמה הקודמת (של ה – Work) ייראה כך אחרי קופילצייה
{
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;
}
}