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);