Null-conditional assignment
A C# korábbi verzióiban a ?. operátor egy lehetséges null objektum tagjának elérését tette lehetővé anélkül, hogy ki kellett volna írnunk a feltételes null ellenőrzést. Azonban ez csak olvasásra volt használható, értékadásnál nem. Tehát ha valami ilyesmit szerettünk volna:
customer?.Order = GetCurrentOrder(); //fordítási hiba korábban
Akkor ki kellett írnunk a teljes null ellenőrzést:
if (customer is not null)
{
customer.Order = GetCurrentOrder();
}
A C# 14 engedélyezi a korábban nem forduló szintaxist, ami az összetett értékadó (-=, += és társaik) operátorokkal is működik.
Lambda paraméter módosítók
C# 14 óta lambda metódusok esetén a ref, in, out és ref readonly módosítók ugyanúgy alkalmazhatóak, mint normál metódusok esetén.
Implicit span conversion
A C# 14 változtat a metódusok feloldási sorrendjén olyan típusok esetén, amelyek Span<T> vagy ReadOnlySpan<T> típusra konvertálhatóak. Régebben a Span alapú API változatok használatához a programozónak explicit kellett ezt a konverziót elvégeznie, ha az új, gyorsabb API változatokat szerette volna használni. A C# 14 azonban ezt módosítja.
Nézzük meg az alábbi példát:
int[] array = { 1, 2, 3 };
Test.DoSomething(array);
static class Test
{
public static void DoSomething(IEnumerable<int> enumerable)
{
Console.WriteLine("IEnumerable overload called");
}
public static void DoSomething(Span<int> span)
{
Console.WriteLine("Span overload called");
}
}
C# 13-on és .NET 9-en a fenti példaprogram nem forduló kódot eredményez, mivel a fordító nem tudja eldönteni, melyik változatot hívja meg. C# 14 és .NET 10 alatt azonban a kód lefordul és a Span overload called kimenetet adja. Azonban ha a DoSomething rendelkezne olyan változattal, amely paraméterként int tömböt várna, akkor azon metódus hívódna meg.
Numeric ordering
Szövegek rendezésekor régóta fennálló probléma, hogy a .NET nem támogatott beépítetten szám alapú sorbarendezést, hanem csak ABC alapút. Ez azt jelentette, hogy sorbarendezve a „Track 9” és „Track 10” szövegeket, a „Track 10” előrébb került, mint a „Track 9”.
Ezentúl a StringComparer.Create metódusnak átadható CompareOptions tartalmaz egy NumericOrdering beállítást, ami ezen viselkedést orvosolja:
using System.Globalization;
var data = new string[]
{
"Track 8",
"Track 10",
"Track 100",
"Track 1",
"Track 9",
};
var comparer = StringComparer.Ordinal;
Console.WriteLine("Ordinal:");
foreach (var track in data.Order(comparer))
{
Console.WriteLine(track);
}
Console.WriteLine();
comparer = StringComparer.Create(CultureInfo.InvariantCulture, CompareOptions.NumericOrdering);
Console.WriteLine("Numeric ordering");
foreach (var track in data.Order(comparer))
{
Console.WriteLine(track);
}
A program kimenete:
Ordinal:
Track 1
Track 10
Track 100
Track 8
Track 9
Numeric ordering
Track 1
Track 8
Track 9
Track 10
Track 100
Szkripting
Az első C# program futtatása részben említettem, hogy .NET 10 óta lehetőségünk van C# nyelven szkripteket is írni, ha a shell fájlunkat a #!/usr/bin/env dotnet sorral kezdjük. Ez top level statement-et használó szkripteket tesz lehetővé számunkra.
A szkriptekben használhatunk meglévő C# projekteket és akár NuGet csomagokat is, illetve nem csak konzol alkalmazásokat tudunk készíteni, hanem akár ASP.NET alkalmazást is ilyen módon, ha a megfelelő SDK-t határozzuk meg.
Ezen opciók meghatározása a #:[beállítás] szintaxissal történik, a shell kompatibilitás miatt. Támogatott opciók:
-
#:sdk
Alapértelmezetten a
Microsoft.NET.Sdkvan használatban, mint .NET konzol alkalmazások esetén, de ha ASP.NET-et akarunk használni, akkor a#:sdk Microsoft.NET.Sdk.Webutasítással tudjuk megtenni. -
#:package
Ezzel az utasítással NuGet csomagot tudunk referálni
csomagnév@verziószintaxisban. A csomag referálása önmagában nem fogja automatikusan a névtereit hozzáadni a szkripthez. Ezt továbbra is ausingutasítással tudjuk megtenni. -
#:property
Ezzel az utasítással olyan tulajdonságokat tudunk megadni, amik a
.csprojfájlban a projekt tulajdonságoknál szoktak szerepelni. Például nyelvi verzió, implicit using, nullable és egyéb beállítások. Például, ha a legfrissebb nyelvi verziót szeretnénk használni a szkriptünkben, akkor a#:property LangVersion previewbeállítást kell megadnunk.
Ha a szkriptünk komplexitása kezd nagy lenni és úgy érezzük érdemes lenne több fájlba, strukturáltan szétszedni, akkor ehhez is kínál segítséget a dotnet parancs. Az alábbi parancs kiadásával projektfájlt tudunk generáltatni a szkriptünkből:
dotnet project convert script.sh
DNX tool
A DNX a .NET 10 egy beépített eszköze, ami azt teszi lehetővé számunkra, hogy .NET toolokat teszteljünk telepítés nélkül. Korábbi .NET verziók esetén, ha ki szerettünk volna próbálni egy toolt, akkor azt először telepítenünk kellet, majd ha nem tetszett, akkor eltávolítanunk futtatás után.
Nézzünk egy példát. Például ha a hivatalos .NET tool demó alkalmazást, a dotnetsay parancsot szeretném kipróbálni, akkor a dnx segítségével ezt egy parancson belül megtehetem:
dnx -y dotnetsay Hello World!
Amennyiben az ilyen módon futtatni kívánt tool nem található meg még a lokális NuGet cache-ben, akkor a dnx meg fogja kérdezni, hogy szeretnénk-e letölteni azt. A -y kapcsoló automatikusan igen választ fog adni erre a kérdésre. A dnx eszköz nélkül az alábbi egy soros parancs az alábbi parancsokkal lenne helyettesíthető:
dotnet tool install dotnetsay
dotnet tool run dotnetsay Hello World!
dotnet tool uninstall dotnetsay