תמונה ראשית עבור 'מה חדש ב- C# 6?' מה חדש ב- C# 6?

שלום לכולם, שמי אלירן פאר וזהו הפוסט הראשון בבלוג החדש שלנו - סשן עוגיות

לאחרונה מייקרוסופט שחררו את Visual Studio 2015, ויחד איתו גם את C# 6. הפוסט היום יעסוק בפיצ'רים החדשים שנעשו בשפה:

1. Conditional Access Operator

החידוש הראשון נקרא Conditional Access Operator (או "אופרטור גישה מותנת"), הסימון שלו הוא ?. ובסיטואציות מסויימות הוא עלול להקל המון על החיים שלכם.

if (University != null){ if (University.Students != null) { int numberOfStudents = University.Students.Count; }})

 

יהפוך ל:

int? numberOfStudents = University?.Students?.Count;

 

האופרטור יחזיר null אם אחד מהאובייקטים בשרשרת הוא null, מה שיכול להיות מאוד שימושי בשרשראות ארוכות.

 


 

2. Auto Property Initializer

זוכרים Auto Properties? אותם Properties שמגדירים עם get ו- set אוטומטיים, מבלי לממש את הגוף שלהם? אז עכשיו גם אפשר לתת להם ערך.

בC# 6 ניתן לעשות השמה לProperty, מה שבסך הכל חוסך להגדיר אותו ב- Constructor.

פעם:

class Person { public string Name { get; set; } public Person  { Name = "Eliran"; } }

 

בC# 6:

class Person { public string Name { get; set; } = "Eliran";}

 

מצריך קצת זמן הסתגלות, אבל בסך הכל יכול לחסוך Constructor מיותר או שניים.

3. שיטה שונה לכתוב Constructor

האמת היא שהחידוש הבא קצת מוזר לי, וקשה לי לראות את עצמי מתרגל לכתוב ככה. החידוש הבא אמור לעזור במצבים שבהם ה- Constructor רק מקבל משתנים ומכניס אותם ל- Properties של המחלקה. במקרה כזה כבר אין צורך לכתוב Constructor שלם, אלא אפשר להשתמש בשיטה החדשה.

פעם:

class Person { public string Name { get; set; } public Person(string name) { this.Name = name; }}

 

בC# 6:

class Person(string name) { public string Name { get; set; } = name;}

 

אני יודע, אני יודע... מחלקה שמקבלת פרמטרים... זה בהחלט מוזר. אבל היי, מי אנחנו שנתווכח עם המעצבים של מייקרוסופט?

4. חידוש מסעיר ב- Out Parameter

אני משער שרוב מי שכותב בC# יותר מיום יומיים נתקל במטודה TryParse - ולמי שבכל זאת לא: מדובר במטודה שנמצאת בכמה מהמחלקות של C#, ומטרתה לנסות ולהפוך string לאובייקט מסויים. לדוגמא, המטודה TryParse ב- int מנסה להפוך string ל... int. המטודה מקבלת 2 פרמטרים: את ה- string שאנחנו רוצים להמיר, ו- out argument שאליו היא תכניס את התוצאה, כשהסיבה ל- out היא שהפונקציה מחזירה bool שמטרתו לייצג האם הניסיון צלח או כשל.

בכל אופן, החידוש הבא פותר סיטואציה מעצבנת מאוד שמתעוררת גם כשמשתמשים בפונקציה הזו (אבל לא רק בה): את המשתנה out חייבים להגדיר לפני, דבר שקוטע את הרצף של הקוד לפעמים.

אני אתחיל בדוגמא, פעם היינו רושמים:

int value = 0;if (int.TryParse("5", out value) && value > 4) { Console.WriteLine("value is greater than 4");}

בC# 6 ניתן לרשום:

if (int.TryParse("5", out int value) && value > 4) { Console.WriteLine("value is greater than 4");}

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

5. Exception Filters

החידוש הבא מאפשר לסנן את ה- Exceptions שאנחנו רוצים לתפוס, על מנת שלא נתפוס סתם Exceptions ובכך נמנע מהם לחלחל.

זה נראה כך:

try { throw new Exception("Eliran");}catch (Exception e) when (e.Message == "Eliran") { Console.WriteLine("Caught Eliran");}

המילה השמורה when מאפשרת לתפוס Exceptions רק כאשר התנאי שבתוכה מתקיים.

6. שימוש ב- using על מחלקה סטטית

עוד חידוש שיקח לי זמן להתרגל אליו, הוא היכולת לעשות using לא רק ל- namespace אלא גם למחלקה סטטית. בצורה זו, ניתן להשתמש בפונקציות של המחלקה הסטטית ללא קריאה לה, כאילו היו אלו פונקציות לוקאליות של המחלקה שאנו כותבים בה.

הדוגמא הבאה תסביר את עצמה:

using static System.Console;public class Program{ public static void Main() { WriteLine("Hello World"); }}

 

קצת לא ברור לטעמי, אבל מי אני שאשפוט.

7. String Interpolation

מי שמכיר קצת PHP מכיר את האפשרות לרשום משתנים בתוך string, כאשר הם מוקפים ב- { }. ב- C# 6 שאבו את האפרשות הזו, וכאשר תכתבו $ לפני ה- string שלכם, הוא יוכל להכיל שמות משתנים.

לדוגמא:

string name = "Eliran";string fruit = "Apple";Console.WriteLine($"{name} is eating an {fruit}");

 

8. Roslyn

החידוש האחרון שאדבר עליו, הוא לא בדיוק חידוש ב- C# 6, אלא יותר ב- Visual Studio 2015:

Visual Studio 2015 היא הגרסא הראשונה של Visual Studio שבאה עם הקומפיילר החדש של .NET - רוסלין! למי שלא מכיר, רוסלין הוא קומפיילר חדש לחלוטין, שלעומת הישן, כתוב כולו ב- C# (במקום ב- C++), והוא Open Source תחת רישיון Apache.

רוסלין מפותח כבר כמה שנים, כאשר היה ניתן להשתמש בו באמצעות תוספים ל- Visual Studio, או ב- Visual Studio Community.

הצעד הזה חשוב מאוד, כיוון שהוא מלמד על זניחת הקומפיילר הקודם ומעבר לפלטפורמת Open Source, שבה באופן תאורתי - כל אחד יכול להרחיב את השפה, או למשל להשתמש בקוד של רוסלין על מנת לקמפל קוד C# לפלטפורמות אחרות.

זהו לבנתיים על C# 6. קיימים עוד שינויים חשובים ומעניינים, כמו await ו- nameof, אבל עליהם כבר ארחיב בפוסט אחר.

שמחתי לראות שהשפה ממשיכה להתרחב ולהתפתח.

תגובות

פוסט מצויין!
טל בן-דוד הגב
יפה מאוד אלירן!
Hadar הגב
תודה
משה הגב
חבל שהם לא מימשו חצי ממה שהם רצו..
C3PO הגב
לC3PO: הם שמים בבטא כל מיני דברים ואז מורידים את מה שהמתכנתים לא אהבו..
Hadar הגב
תודה רבה.
aviv הגב

הוסף תגובה