Megosztás a következőn keresztül:


A C# 12 újdonságai

A C# 12 az alábbi új funkciókat tartalmazza. Ezeket a funkciókat a legújabb Visual Studio 2022 verzióval vagy a .NET 8 SDK próbálhatod ki.

A C# 12 támogatott .NET 8. További információért lásd: C# nyelv verziószámozás.

A legújabb .NET 8 SDK-t a .NET letöltési oldaláról töltheti le. Letöltheti Visual Studio 2022is, amely tartalmazza a .NET 8 SDK-t is.

Jegyzet

Szeretnénk visszajelzést küldeni ezekről a funkciókról. Ha problémákat talál az új funkciók bármelyikével kapcsolatban, hozzon létre egy új problémát, a dotnet/roslyn adattárban.

Elsődleges konstruktorok

Mostantól bármelyik class és struct-ben létrehozhatsz elsődleges konstruktorokat. Az elsődleges konstruktorok már nem korlátozódnak record típusokra. Az elsődleges konstruktorparaméterek az osztály teljes törzsének hatókörébe tartoznak. Annak érdekében, hogy minden elsődleges konstruktorparaméter biztosan hozzá legyen rendelve, minden explicit módon deklarált konstruktornak meg kell hívnia az elsődleges konstruktort this() szintaxis használatával. Elsődleges konstruktort adva egy class-hoz megakadályozza, hogy a fordító egy implicit paraméter nélküli konstruktort deklaráljon. Egy struct-ban az implicit paraméter nélküli konstruktor inicializálja az összes tagot, beleértve az elsődleges konstruktorparamétereket is, a 0 bites mintára.

A fordító csak az record típusok esetén, vagy az record class és record struct típusoknál hoz létre nyilvános tulajdonságokat az elsődleges konstruktorparaméterekhez. Előfordulhat, hogy a nem rögzített osztályok és szerkezetek nem mindig szeretnék ezt a viselkedést az elsődleges konstruktorparaméterek esetében.

További információt az elsődleges konstruktorokról a számú, az elsődleges konstruktorokat bemutató oktatóanyagban és a számú, a példánykonstruktorokról szólócikkben találhat.

Gyűjteménykifejezések

A gyűjteménykifejezések új terse szintaxist vezetnek be a gyakori gyűjteményértékek létrehozásához. Más gyűjteményeket ezekbe az értékekbe illeszthet a spread operátor használatával ..e.

Több gyűjteményszerű típus is létrehozható külső BCL-támogatás nélkül. Ezek a típusok a következők:

Az alábbi példák a gyűjteménykifejezések használatát mutatják be:

// Create an array:
int[] a = [1, 2, 3, 4, 5, 6, 7, 8];

// Create a list:
List<string> b = ["one", "two", "three"];

// Create a span
Span<char> c  = ['a', 'b', 'c', 'd', 'e', 'f', 'h', 'i'];

// Create a jagged 2D array:
int[][] twoD = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];

// Create a jagged 2D array from variables:
int[] row0 = [1, 2, 3];
int[] row1 = [4, 5, 6];
int[] row2 = [7, 8, 9];
int[][] twoDFromVariables = [row0, row1, row2];

A spread elem, ..e egy gyűjteménykifejezésben hozzáadja a kifejezés összes elemét. Az argumentumnak gyűjteménytípusnak kell lennie. Az alábbi példák a szóráselem működését mutatják be:

int[] row0 = [1, 2, 3];
int[] row1 = [4, 5, 6];
int[] row2 = [7, 8, 9];
int[] single = [.. row0, .. row1, .. row2];
foreach (var element in single)
{
    Console.Write($"{element}, ");
}
// output:
// 1, 2, 3, 4, 5, 6, 7, 8, 9,

A spread elem kiértékeli az enumerálások kifejezés minden elemét. Minden elem szerepel a kimeneti gyűjteményben.

A gyűjteménykifejezéseket bárhol használhatja, ahol szüksége van elemek gyűjteményére. Megadhatja a gyűjtemény kezdeti értékét, vagy argumentumként továbbíthatók a gyűjteménytípusokat használó metódusoknak. A gyűjteménykifejezésekről az nyelvi referenciacikkében vagy a funkció specifikációjárólolvashat bővebben.

ref readonly paraméterek

A C# in paramétereket adott hozzá az olvasható hivatkozások átadásához. in paraméterek lehetővé teszik mind a változókat, mind az értékeket, és az argumentumokon széljegyzetek nélkül is használhatók.

A ref readonly paraméterek hozzáadása nagyobb átláthatóságot tesz lehetővé az olyan API-k számára, amelyek ref paramétereket vagy in paramétereket használnak:

A ref readonly paraméterekkel kapcsolatos további információkért tekintse meg a nyelvi referencia paramétermódosítókról szóló cikkét, vagy a ref readonly paraméter funkció specifikációját.

Alapértelmezett lambdaparaméterek

Mostantól definiálhat alapértelmezett értékeket a lambda-kifejezések paramétereihez. A szintaxis és a szabályok megegyeznek az argumentumok alapértelmezett értékeinek bármely metódushoz vagy helyi függvényhez való hozzáadásával.

A lambdakifejezések alapértelmezett paramétereiről további információt lambdakifejezésekcímű cikkben talál.

Bármilyen típusú alias

Az using alias-irányelv használatával bármilyen típust aliasként használhat, nem csak névvel ellátott típusokat. Ez azt jelenti, hogy szemantikai aliasokat hozhat létre a rekordtípusokhoz, tömbtípusokhoz, mutatótípusokhoz vagy egyéb nem biztonságos típusokhoz. További információ: funkcióspecifikáció. A .NET blog cikkében található egy példa újrastrukturálási áttekintésre: Refaktoráld a kódod bármilyen típusú alias használatával.

Beágyazott tömbök

A futtatókörnyezeti csapat és más kódtár-szerzők beágyazott tömböket használnak az alkalmazások teljesítményének javítására. A beágyazott tömbök lehetővé teszik a fejlesztők számára, hogy rögzített méretű tömböket hozzanak létre struct típusban. A beágyazott pufferrel rendelkező szerkezeteknek a nem biztonságos rögzített méretű pufferhez hasonló teljesítményjellemzőket kell biztosítaniuk. Valószínűleg nem deklarálja a saját beágyazott tömböket, de transzparens módon használja őket, amikor System.Span<T> vagy System.ReadOnlySpan<T> objektumként vannak közzétéve a futtatókörnyezeti API-kból.

A beágyazott tömb az alábbi structhasonlóan deklarálva van:

[System.Runtime.CompilerServices.InlineArray(10)]
public struct Buffer
{
    private int _element0;
}

Mint bármely más tömböt, úgy használja őket:

var buffer = new Buffer();
for (int i = 0; i < 10; i++)
{
    buffer[i] = i;
}

foreach (var i in buffer)
{
    Console.WriteLine(i);
}

A különbség az, hogy a fordító kihasználhatja az inline tömbökről ismert információkat. Valószínűleg ugyanúgy használ beágyazott tömböket, mint bármely más tömböt. A beágyazott tömbök deklarálásáról szóló további információkért tekintse meg a struct típusoknyelvi referenciáját.

Kísérleti attribútum

A típusok, eljárások vagy szerelvények megjelölhetők a System.Diagnostics.CodeAnalysis.ExperimentalAttribute jelzéssel egy kísérleti funkcióként. A fordító figyelmeztetést ad ki, ha hozzáfér egy metódushoz vagy típushoz, amely a ExperimentalAttribute-nal van jelölve. A Experimental attribútummal megjelölt szerelvényben szereplő összes típus kísérleti jellegű. További részleteket a fordító által beolvasott általános attribútumokról a cikkben, vagy a szolgáltatás specifikációjábanolvashat.

Elfogók

Figyelmeztetés

A interceptors egy kísérleti funkció, amely előzetes verzióban érhető el a C# 12-vel. Előfordulhat, hogy a funkció egy későbbi kiadásban kompatibilitástörő változásoknak vagy eltávolításnak lesz kitéve. Ezért éles vagy kiadott alkalmazásokhoz nem ajánlott.

Az elfogók használatához a felhasználói projektnek meg kell adnia a <InterceptorsPreviewNamespaces>tulajdonságot. Ez azoknak a névtereknek a listája, amelyek tartalmazhatnak interceptorokat.

Például: <InterceptorsPreviewNamespaces>$(InterceptorsPreviewNamespaces);Microsoft.AspNetCore.Http.Generated;MyLibrary.Generated</InterceptorsPreviewNamespaces>

A elfogó olyan módszer, amely deklaratív módon helyettesítheti a elfogható metódus hívását önmagára a fordítási időben. Ez a helyettesítés úgy történik, hogy az elfogó deklarálja az általa lehallgatott hívások forráshelyét. Az interceptorok korlátozott lehetőséget biztosítanak arra, hogy a meglévő kód szemantikáját módosítsák új kód hozzáadása révén egy fordítás során, például egy forrásgenerátorban.

Egy elfogót használsz forrásgenerátor részeként a meglévő forrásfordítás kódjának módosítására, ahelyett hogy kódot adnál hozzá. A forrásgenerátor a lehallgatható metódus hívásait a elfogó metódus hívásával helyettesíti.

Ha szeretne kísérletezni az elfogókkal, további információt szerezhet a funkció specifikációjánakolvasásával. Ha használja a funkciót, ügyeljen arra, hogy naprakész maradjon a kísérleti funkció funkciós specifikációjának változásaival. Ha a funkció véglegesítve van, további útmutatást adunk ehhez a webhelyhez.

Lásd még: