Noutăți în C# 11
Modele de liste
Modelele de liste (list pattern) permit compararea expresiilor cu liste și array-uri. Poți compara un model de listă și poți seta toate elementele unui array:
[2, 3, 4, 5] // acest model corespunde oricărui array/listă care este egal(ă) cu [2, 3, 4, 5]
De asemenea, cu ajutorul caracterului de subliniere _ poți seta un element arbitrar, a cărui valoare nu contează:
[_, 5] // acest model corespunde oricărui array/listă din două elemente unde al doilea element este egal cu 5 (de exemplu, [1, 5] sau [25, 5])
Și, în plus, cu ajutorul modelului de tip slice .. poți seta un număr arbitrar de elemente:
[2, .., 5] // acest model corespunde oricărui array/listă unde primul element este egal cu 2 iar ultimul element este egal cu 5, iar între 2 și 5 poate fi un număr arbitrar de elemente arbitrare (de exemplu, [2, 5] sau [2, 3, 9, 5])
Exemplu de utilizare:
Console.WriteLine(GetNumber(new[] { 2, 3, 5 })); // 1
Console.WriteLine(GetNumber(new[] { 2, 4, 5 })); // 2
Console.WriteLine(GetNumber(new[] { 2, 3, 4, 5 })); // 3
Console.WriteLine(GetNumber(new[] { 1, 2, 3 })); // 4
Console.WriteLine(GetNumber(new int[] { })); // 4
int GetNumber(int[] values) => values switch
{
[2, 3, 5] => 1,
[2, _, 5] => 2,
[2, .., 5] => 3,
[..] => 4
};
Generice în atribute
În C# 11, poți defini clase de atribute generice:
class C
{
[Reader<int>]
public void M()
{
}
}
class ReaderAttribute<T> : Attribute
{
}
Șiruri de caractere pe mai multe linii
Cu ajutorul a trei perechi de ghilimele duble, poți crea un text pe mai multe linii, inclusiv folosind interpolarea:
Print();
PrintValue("hello");
void Print()
{
string text = """
<element attr="content">
<body>
</body>
</element>
""";
Console.WriteLine(text);
}
void PrintValue(string val)
{
string text = $"""
<element attr="content">
<body>
{val}
</body>
</element>
""";
Console.WriteLine(text);
}
Literaluri de șiruri UTF-8
C# 11 permite convertirea automată a șirurilor cu caractere UTF-8 în reprezentarea lor binară sub formă de obiect ReadOnlySpan<byte>:
ReadOnlySpan<byte> span2 = "hello"u8;
Pentru a indica faptul că un șir reprezintă UTF-8, se adaugă sufixul u8 la șir.
Fișier ca domeniu de vizibilitate
C# 11 a adăugat un nou modificator de vizibilitate - file, care se aplică claselor, structurilor, delegaților, enumerărilor și interfețelor. Tipurile cu acest modificator pot fi utilizate doar în interiorul fișierului de cod curent.
file class Person
{
}
Acest modificator nu poate fi utilizat împreună cu alte modificatoare.
Modificatorul required
Modificatorul required (adăugat în C# 11) indică faptul că un câmp sau proprietate cu acest modificator trebuie neapărat să fie inițializat(ă). De exemplu, în următorul exemplu, vom obține o eroare:
Person tom = new Person(); // eroare - proprietățile Name și Age nu sunt inițializate
public class Person
{
public required string Name { get; set; }
public required int Age { get; set; }
}
Aici, proprietățile Name și Age sunt marcate ca fiind obligatorii pentru inițializare cu ajutorul modificatorului required, așa că trebuie să folosești un inițializator pentru a le inițializa:
Person tom = new Person { Name = "Tom", Age = 38 }; // fără eroare
Indiferent dacă setezi aceste proprietăți în constructor sau le inițializezi la definire, tot trebuie să folosești un inițializator pentru a le seta valorile. De exemplu, în următorul exemplu, vom obține o eroare:
Person bob = new Person("Bob"); // eroare - proprietățile Name și Age trebuie totuși setate în inițializator
public class Person
{
public Person(string name)
{
Name = name;
}
public required string Name { get; set; }
public required int Age { get; set; } = 22;
}