MySQL Java JavaScript PHP Python HTML-CSS C-sharp

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;
}
← Lecția anterioară Lecția următoare →