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.
Elsődleges konstruktorok – Bevezetés a Visual Studio 2022 17.6 Előzetes verzió 2-es verziójába.
Gyűjteménykifejezések – Bevezetés a Visual Studio 2022 17.7 Előzetes verzió 5-ös verziójába.
Beágyazott tömbök – Bevezetés a Visual Studio 2022 17.7 Előzetes verzió 3. verziójába.
Választható paraméterek a Lambda-kifejezésekben – A Visual Studio 2022 17.5 Preview 2-es verziójában jelent meg.
ref readonly
paraméterek – Bevezetés a Visual Studio 2022 17.8 Előzetes verzió 2- es verziójába.Bármilyen típusú alias – A Visual Studio 2022 17.6 Előzetes verzió 3. verziójában jelent meg.
Kísérleti attribútum – Bevezetés a Visual Studio 2022 17.7 Előzetes verzió 3- es verziójába.
A Visual Studio 2022 17.7 Előzetes verzió 3. verziójában bevezetett Interceptors - Preview funkció.
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. struct
Az 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 class
record 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:
- Tömbtípusok, például
int[]
. - System.Span<T> és System.ReadOnlySpan<T>.
- Olyan típusok, amelyek támogatják a gyűjtemény inicializálóit, például System.Collections.Generic.List<T>.
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 korábban
in
létrehozott API-k akkor is használhatókref
, ha az argumentum nincs módosítva. Ezek az API-k frissíthetők aref readonly
. Nem lesz kompatibilitástörő változás a hívók számára, mintha a paramétert aref
rendszer erre változtatnáin
. Például: System.Runtime.InteropServices.Marshal.QueryInterface. - Azok az API-k, amelyek egy paramétert
in
vesznek fel, de logikailag változót igényelnek. Az értékkifejezések nem működnek. Például: System.ReadOnlySpan<T>.ReadOnlySpan<T>(T). - Azok az API-k, amelyek azért használatosak
ref
, mert változót igényelnek, de nem mutálják a változót. Például: System.Runtime.CompilerServices.Unsafe.IsNullRef.
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 struct
hasonló 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.