S novou verziou vývojovej platformy .NET 8 vyšiel aj jazyk C# 12. Na rozdiel od posledných pár rokov, keď jazyk prešiel dramatickými zmenami, najnovšia verzia prináša len zopár zmien. Ukážeme si tri podstatnejšie zmeny.
Primárne koštruktory umožňujú zjednodušiť tvorbu koštruktorov tried a štruktúr. V príklade použijeme parametre name a occupation pri inicializácii atribútov. Explicitná definícia koštruktora sa vypustila.
var users = new HashSet<User>
{
new ("John Doe", "gardener"),
new ("Roger Roe", "driver"),
new ("Lucy Smith", "teacher")
};
var u = new User("John Doe", "gardener");
Console.WriteLine(users.Contains(u));
class User(string name, string occupation)
{
string Name { get; } = name;
string Occupation { get; } = occupation;
public override bool Equals(object? obj)
{
return obj is User user &&
Name == user.Name &&
Occupation == user.Occupation;
}
public override int GetHashCode()
{
return HashCode.Combine(Name, Occupation);
}
}
Collection expressions zjednodušujú a štandardizujú definíciu zoznamov, polí a span štruktúr. Vývojári už v minulých verziách výrazne zjednodušili definíciu zoznamov. V najnovšej verzii môžeme použiť na inicializáciu zoznamov a polí syntax [1, 2, 3, 4], čo je štandardom v mnohých, predovšetkým dynamických jazykoch. Uvažuje sa nad použitím syntaxe aj pre slovníky.
List<int> vals = new List<int>() { 1, 2, 3, 4, 5 };
Console.WriteLine(vals[0]);
List<int> vals2 = new() { 1, 2, 3, 4, 5 };
Console.WriteLine(vals2[^1]);
List<int> vals3 = [1, 2, 3, 4, 5];
Console.WriteLine(vals3.Max());
int[] vals4 = [1, 2, 3, 4, 5];
Console.WriteLine(vals4.Min());
Lambda výrazy podporujú implicitne definované parametre. Tie sa potom nemusia pri invokácii delegátov uviesť. Musia byť uvedené až na konci deklarovaných parametrov.
var message = (string greet, string name = "there") => $"{greet} {name}!";
var res = message("Hi", "Tom");
Console.WriteLine(res);
var res2 = message("Hello");
Console.WriteLine(res2);