בגרסאות האחרונות, בפרט בגרסה 7, מייקרוסופט שיפרה מאוד את הSyntex של השפה,
הפשיטה אותו, והורידה תווים מיותרים.
ממליצה מאוד להתחיל להשתמש בקיצורים המעולים הללו, שהופכים את הקוד לפשוט וקריא יותר,
אני אישית בקשתי מהצוות שלי, שעל כל Request Review שהן שולחות,
תוספנה איזה תיקון רטרואקטיבי לקוד קיים, שישדרג אותו.
להלן כמה מהשיפורים המשמעותיים:
Arrow Operator =>
או בשמו המייקרוסופטי: Lambda Operator מדובר ב"השאלה" מוצלחת מJS, וניתן להשתמש בו בכל פונקציה או Property המכילים פקודה אחת בלבד
דוגמאות:
//Old
public int Sum
{
get
{
return X + Y;
}
}
//New
public int Sum => X + Y;
גם הפונקציות לא הוזנחו, ואפשר להשתמש באופן הזה, במקום:
//Old
public int Sum(int x, int y)
{
return x + y;
}
//New
public int Sum(int x, int y) => x + y;
ואפילו כך (עובדת חרוצה אחת ספרה את הפער בתווים, וטענה בצדק שאין כאן הבדל לטובת ה=> אם כי זה בהחלט יותר ברור):
//Old
public int Sum { set { X = value; } }
//New
public int Sum { set => X = value; }
באתר מיקרוסופט: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/lambda-operator
Out variables
עד היום, בשביל להעביר out parameter לפונקציה, היה צורך צורך להגדיר מראש
public void PrintCoordinates(Point p)
{
int x, y; // have to "predeclare"
p.GetCoordinates(out x, out y);
WriteLine($"({x}, {y})");
}
מהיום, ההגדרה יכולה להתבצע בשורת השליחה באופן הבא:
public void PrintCoordinates(Point p)
{
p.GetCoordinates(out int x, out int y);
WriteLine($"({x}, {y})");
}
Tuples
אין ספק שכל מפתח נתקל בדילמה הזו: צריך להחזיר מפונקציה 3 ערכים,
"אמממ, לבנות struct/ class בשביל פונקציה אחת? קצת בזבוז..."
"להשתמש בout? מעיק..."
אז באה מיקרוסופט ופתרה את הבעיה בדמות Tuple, בוורסיה הקודמת שלו, הוא באמת לא משהוא, אבל לפחות חוסך.
הם יצרו 8 מחלקות ג'נריות שמכילות עד 8 Properties לפי הצורך והType יקבע לפי מה שהמשתמש יעביר, דוג':
var tuple = new Tuple<int, string, bool>(1, "cat", true);
// Part B: access tuple properties.
if (tuple.Item1 == 1)
{
Console.WriteLine(tuple.Item1);
}
האמת, שתמיד חיכיתי שC# תשדרג את הTuple ויגיע קוד שלא חשבנו עליו, אז הנה זה הגיע:
הגדרה פשוטה ממש:
var named = (first: "one", second: "two");
if(named.first == "one")
יש לזה כמובן עוד שימושים והרחבות, ששווה ממש לקרוא עליהם כאן:
https://docs.microsoft.com/en-us/dotnet/csharp/tuples
עד כאן בינתיים, נתראה במאמר המשך לנושא,
רק בריאות ושמחות בעזרת ה'
שושנה
מוסיפה עוד 2 דברים שכדאי להכיר בשפה:
הגדרת משתנה חדש והשמה, בתוך ה if statement כתוצאה של התנאי
if (jObject["event"] is JObject @event) { doSomthing = Do(@event); }
Switch מקונן
שימו לב להתייחסות לdefault case הפנימי
switch (val) { case Type1: Do1(); break; case Type2: var res = await HttpGet(params); context.Response.StatusCode = res.Response switch { "ERROR" => 500, "VALIDATION_ERRORS" => 400, _ => context.Response.StatusCode }; break; default: break; }