מה חדש ב-C#12?

Primary Constructors

אפשר ליצור constructor ל-class בשורת הגדרת ה-class.

// Previous way
public class Person
{
  public Person(string name)
  {
  }
}

// New way
public class Person(string name)
{
}

// Define a person
var person = new Person("Jack");

בדרך שבה הוגדר קודם ה-ctor, לא היה אפשר להשתמש בערכים שעברו ל-ctor אלא אם כן עשינו השמה למשתנים של ה-class.

אפשר עכשיו להשתמש ישירות במשתנים:

public class Person(string name, DateOnly dateOfBirth)
{
  public string Name { get; } = name;
  // Using for computed properties, for demonstration, not working with dates like this.
  public int Age { get; } = DateTime.Today.Year - dateOfBirth.year;

  // Can be used in methods too.
}

Collection Expression

נניח שאני רוצה להגדיר מערך של מספרים.

int[] a = new int[] {1, 2, 3, 4};

עכשיו אפשר להשתמש ב-Collection Expression ולפשט את התהליך.

int[] a = [1, 2, 3, 4];

Ref Readonly Paramaters

בהעברה של משתנה לפונקציה עם ref, משתנה הערך של המשנה עצמו גם מחוץ לפונקציה. אפשר להעביר את הערך של המשתנה עם ref, אבל להוסיף לו readonly ואז הוא לא משנה את הערך החיצוני.

Default Lambda Parameters

נניח שיש לנו פונקציית lanbda:

var lambda = (int age) => $"You are {age} years old";

כדי לקרוא לפונקציה חייבים להעביר אליה ערך למשתנה age:

lambda(30);

לא היה אפשר לשים ערך ברירת מחדל. עכשיו אפשר לעשות את זה.

var lambda = (int age = 40) => $"You are {age} years old";
lambda();

Alias Any Type

אפשר ליצור ולהשתמש בהגדרות של record בצורה כזאת:

using Point2d = (int X, int Y);
Point2d point = (6, 9);

Experimental Attr

נניח שיש לי את ה-class הזה ואני רוצה להוסיף feature שהוא לא לגמרי בטוח, אולי הוא ניסיוני. משתמשים במילה Experimental לסמן את זה וכותבים מה הרכיב הניסיוני.

[Experimental("RiskyId")]
public class RiskyFeature
{
}

עכשיו אם ננסה להשתמש ב-class הזה נקבל שגיאה.

var risky = RiskyFeature();

כדי להשתמש בזה צריך ללכת לקובץ csproj ולהשתמש ב-property של <NoWarn>.

Interceptors

הרעיון בזה הוא שיש לי פונקציה בתוך class ואני יכולה "להתערב" ולגרום לזה שבקריאה לפונקציה הזאת, הקוד יקרא לפונקציה אחרת.