מה חדש ב-C# 6: בניית מחרוזת

עד היום, כאשר רצינו ליצור מחרוזות עם שילוב של ערכים מפונקציות או משתנים היינו צריכים להשתמש באחת הפונקציות מהמובנות של C# כמו string.Format או string.Concat.

השימוש ב-string.Format היה לעיתים מסורבל ולא נוח, היינו צריכים לזכור את סדר המשתנים שהגדרנו במחרוזת ולהגדיר אותם בסדר זהה בסוף המחרוזת, אם היינו מורידים משתנה או רוצים לשנות את הסדר זה היה יכול לגרום לתוצאות לא רצויות ואפילו לזריקת שגיאות לא צפויות (Exceptions).

String Interpolation עם משתנים

ב-C#6 הוסיפו את הפונקציונליות שנקראת String Interpolation, שמאפשרת לנו לכתוב את המשתנים בתוך המחרוזת עצמה ולא בסוף כמו ב-string.Format.

הכתיבה של String Interpolation מתחילה עם סימן שאלה (?) לפני תחילת המחרוזת. כאשר נרצה להוסיף ערכים ממשתנים אחרים (למשל המשתנה numOfStudents מסוג int בדוגמה הבאה), נעטוף אותו בסוגריים מסולסלים ובתוך הסוגריים נרשום את שמו של המשתנה.

ניתן לראות את הבדלים בכתיבת הקוד בדוגמה הבאה כאשר המשתנה stringInterpolation מציג את הכתיבה החדשה: 

int numOfStudents = 5;
string stringFormat = string.Format("I have {0} students in my course", numOfStudents);
string stringInterpolation = $"I have {numOfStudents} students in my course";

והתוצאה בשתי המקרים תהיה זהה: 

I have 5 students in my course

 

 

String Interpolation עם פונקציות

לא חייבים להשתמש רק במשתנים שמוגדרים מראש, אפשר לרשום גם קריאה לפונקציות כמו בדוגמה הבאה כאשר השתמשתי בפונקציה Average שמחזירה לנו את ממוצע הציונים:

int numOfStudents = 5;
List<int> gradeList = new List<int> { 92, 83, 100, 88, 93 };
string stringFormat = string.Format("I have {0} students in my course and their average grade is {1}", numOfStudents, gradeList.Average());
string stringInterpolation = $"I have {numOfStudents} students in my course and their average grade is {gradeList.Average()}";

וגם כאן, התוצאה תהיה זהה:

I have 5 students in my course and their average grade is 91.2

 

אפשר לראות בשתי הדוגמאות שהשימוש ב-String Interpolation הופך את הקוד להרבה יותר קריא וברור.

 

האם שימוש ב- String Interpolation פוגע בביצועים?

מבחינת ביצועים, בזמן הקומפילציה הקוד הופך ל-string.Format, כך שהביצועים אמורים להיות זהים.

 

האם אפשר להפסיק להשתמש ב- string.Format?

באופן כללי, אני לא ממליץ להימנע באופן סופי מ- string.Format, אלא לבחון כל מקרה לגופו, יש מקרים שעדיין יהיה נוח יותר להשתמש ב- string.Format למשל:

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

• שינוי מבנה המחרוזת לפי תנאי מסוים אך עם משתנים זהים, למשל, כאשר נרצה להציג מחרוזת במבנה מסוים במקרה והמספר שלנו הוא 1 לעומת מקרה שבו המספר שלנו שונה מ-1 ובו נציג מחרוזת במבנה אחר, כמו בדוגמה הבאה:

int numOfStudents = 5;
List<int> gradeList = new List<int> { 92, 83, 100, 88, 93 };
string stringFormat;

if (numOfStudents == 1)
{
    stringFormat = "I have {0} student in my course and his average grade is {1}";
}
else
{
    stringFormat = "I have {0} students in my course and their average grade is {1}";
}
string stringFormatResult = string.Format(stringFormat, numOfStudents, gradeList.Average());

הדוגמה הזאת תומכת בשתי האפשריות ומאפשרת לי השמה של הערכים בשורה אחת. אם הייתי צריך להשתמש במקרה זה ב String Interpolation, הייתי צריך למלא הערכים בכל אחת מהאפשרויות בתוך ה-if, שזוהי אפשרות פחות מומלצת.

 

 

תגיות:

הוסף תגובה