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 Visual Studio 2022 legújabb verziójával vagy a .NET 8 SDK-val is kipróbálhatja.

A C# 12 támogatott a .NET 8-on. További információ: C# nyelvi verziószámozás.

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

Feljegyzés

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

Most már létrehozhat elsődleges konstruktorokat bármelyik class és struct. Az elsődleges konstruktorok már nem korlátozódnak a típusokra record . Az elsődleges konstruktorparaméterek az osztály teljes törzsének hatókörébe tartoznak. Annak biztosítása érdekében, hogy minden elsődleges konstruktorparaméter biztosan hozzá legyen rendelve, minden explicit módon deklarált konstruktornak szintaxissal this() kell meghívnia az elsődleges konstruktort. Az elsődleges konstruktor hozzáadása megakadályozza, hogy class a fordító implicit paraméter nélküli konstruktort deklaráljon. structAz implicit paraméter nélküli konstruktor inicializálja az összes mezőt, beleértve az elsődleges konstruktorparamétereket is a 0 bites mintára.

A fordító nyilvános tulajdonságokat hoz létre az elsődleges konstruktorparaméterekhez csak típusok record classrecord struct vagy típusok eseténrecord. 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.

Az elsődleges konstruktorokról az elsődleges konstruktorok feltárásáról szóló oktatóanyagban és a példánykonstruktorokról szóló cikkben tudhat meg többet.

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. Ha más gyűjteményeket is beszed ezekbe az értékekbe, az oldalpár operátorral ..lehetséges.

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

Az oldalpár operátora.. egy gyűjteménykifejezésben az argumentumát a gyűjtemény elemeire cseréli. Az argumentumnak gyűjteménytípusnak kell lennie. Az alábbi példák az oldalpár operátor 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 operátor operandusa egy számba vehető kifejezés. Az oldalpár operátor kiértékeli az enumerálások kifejezés minden elemét.

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 a gyűjteménykifejezésekről vagy a szolgáltatás specifikációjáról szóló nyelvi referenciacikkben talál további információt.

ref readonly Paraméterek

A C# paramétereket adott hozzá in az olvasható hivatkozások átadásához. in a 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 paraméterek hozzáadása ref readonly nagyobb átláthatóságot tesz lehetővé az olyan API-k számára, amelyek paramétereket vagy in paramétereket használnakref:

A paraméterekkel kapcsolatos ref readonly további információkért tekintse meg a nyelvi referencia paramétermódosítóiról szóló cikket vagy a ref readonly parameters 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 a lambdakifejezésekről szóló cikkben talál további információt.

Bármilyen típusú alias

Az alias-direktíva using 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ókért tekintse meg a funkció specifikációját.

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ő számára, hogy rögzített méretű tömböt hozzon létre egy 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 futtatókörnyezeti API-kból vagy System.ReadOnlySpan<T> objektumokként vannak közzétéveSystem.Span<T>.

A beágyazott tömb a következőhöz structhasonló deklarálva van:

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

A többi tömbhöz hasonlóan 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 a beágyazott tömbök ismert információinak előnyeit. 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ációjára vonatkozó további információkért tekintse meg a típusokra vonatkozó nyelvi referenciátstruct.

Kísérleti attribútum

A típusok, módszerek vagy szerelvények megjelölhetők a System.Diagnostics.CodeAnalysis.ExperimentalAttribute kísérleti jellemzők jelzésére. A fordító figyelmeztetést ad ki, ha egy metódushoz fér hozzá, vagy beírja a jegyzetet a ExperimentalAttribute. Az attribútummal Experimental megjelölt szerelvényben szereplő összes típus kísérleti. A fordító által beolvasott általános attribútumokról vagy a szolgáltatás specifikációiról szóló cikkben olvashat bővebben.

Elfogó

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 tulajdonságot <InterceptorsPreviewNamespaces>. Ez azoknak a névtereknek a listája, amelyek tartalmazhatnak elfogófogókat.

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

Az elfogó egy olyan módszer, amely deklaratív módon helyettesítheti a lehallgatható metódus hívását a fordítási időpontban önmagára irányuló hívással. Ez a helyettesítés úgy történik, hogy az elfogó deklarálja az általa lehallgatott hívások forráshelyét. Az elfogók korlátozott lehetőséget biztosítanak a meglévő kód szemantikájának módosítására, ha új kódot adnak hozzá egy fordításhoz, például egy forrásgenerátorban.

A forrásgenerátor részeként egy elfogót használ a módosításhoz, ahelyett, hogy kódot ad hozzá egy meglévő forrásfordításhoz. A forrásgenerátor a lehallgatható metódus hívásait az elfogó metódus hívásával helyettesíti.

Ha érdekli a interceptorokkal való kísérletezés, a funkció specifikációjának elolvasásával többet is megtudhat. 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