A C# 10 újdonságai
A C# 10 a következő funkciókat és fejlesztéseket adja hozzá a C# nyelvhez:
- Rekordstruktúra
- A struktúratípusok fejlesztése
- Interpolált sztringkezelők
global using
Irányelvek- Fájlhatókörű névtér deklarációja
- Kiterjesztett tulajdonságminták
- Fejlesztések a lambda-kifejezéseken
- Interpolált sztringek engedélyezése
const
- A rekordtípusok lezárhatók
ToString()
- Továbbfejlesztett határozott hozzárendelés
- Hozzárendelés és deklaráció engedélyezése ugyanabban a dekonstruálásban
- Attribútum engedélyezése
AsyncMethodBuilder
metódusokon - CallerArgumentExpression attribútum
- Továbbfejlesztett
#line
pragma - 6. figyelmeztetési hullám
A C# 10 támogatott a .NET 6-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 6 SDK-t. Letöltheti a Visual Studio 2022-t is, amely tartalmazza a .NET 6 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 .
Rekordstruktúra
Az értéktípus rekordjait deklarálhatja a deklarációkkalreadonly record struct
.record struct
Most már egyértelművé teheti, hogy egy record
hivatkozástípus a record class
deklarációval.
A struktúratípusok fejlesztése
A C# 10 a következő fejlesztéseket vezeti be a struktúratípusokhoz:
- A példányok paraméter nélküli konstruktorait egy struktúratípusban deklarálhatja, és inicializálhat egy példánymezőt vagy tulajdonságot a deklaráláskor. További információkért tekintse meg a Struktúratípusok cikk Strukturálás inicializálása és alapértelmezett értékei című szakaszát.
- A kifejezés bal oldali operandusa
with
bármilyen struktúratípusú vagy névtelen (hivatkozási) típus lehet.
Interpolált sztringkezelő
Létrehozhat egy típust, amely az eredményül kapott sztringet egy interpolált sztringkifejezésből hozza létre. A .NET-kódtárak ezt a funkciót számos API-ban használják. Ezt az oktatóanyagot követve készíthet egyet.
Globálisan használt irányelvek
A módosítót bármely olyan irányelvhez hozzáadhatjaglobal
, amely arra utasítja a fordítót, hogy az irányelv az összes forrásfájlra érvényes legyen a fordításban. Ez általában egy projekt összes forrásfájlja.
Fájlhatókörű névtér deklarációja
A deklaráció új formájával namespace
deklarálhatja, hogy a következő deklarációk a deklarált névtér tagjai:
namespace MyNamespace;
Ez az új szintaxis vízszintes és függőleges térközt is ment a deklarációkhoz namespace
.
Kiterjesztett tulajdonságminták
A C# 10-től kezdve hivatkozhat beágyazott tulajdonságokra vagy mezőkre egy tulajdonságmintán belül. Például az űrlap mintája
{ Prop1.Prop2: pattern }
C# 10-ben és újabbban érvényes, és egyenértékű a
{ Prop1: { Prop2: pattern } }
érvényes a C# 8.0-s és újabb verzióiban.
További információ: Kiterjesztett tulajdonságminták funkciójavaslat megjegyzése. A tulajdonságmintával kapcsolatos további információkért tekintse meg a Minták cikk Tulajdonságminta szakaszát.
Lambda-kifejezés fejlesztései
A C# 10 számos fejlesztést tartalmaz a Lambda-kifejezések kezelésének terén:
- A Lambda-kifejezések természetes típusúak lehetnek, ahol a fordító delegált típust tud kikövetkeztetni a lambda kifejezésből vagy metóduscsoportból.
- A Lambda-kifejezések visszatérési típust deklarálhatnak, ha a fordító nem tudja következtetni.
- Attribútumok alkalmazhatók a lambda kifejezésekre.
Ezek a funkciók a lambda kifejezéseket jobban hasonlítanak a metódusokhoz és a helyi függvényekhez. Megkönnyítik a lambdakifejezések használatát delegált típusú változó deklarálása nélkül, és zökkenőmentesebben működnek az új ASP.NET Core Minimal API-kkal.
Állandó interpolált sztringek
A C# 10-ben sztringek inicializálhatók sztring interpolációval, const
ha az összes helyőrző maga állandó sztring. A sztringek interpolációja olvashatóbb állandó sztringeket hozhat létre az alkalmazásban használt állandó sztringek létrehozásakor. A helyőrző kifejezések nem lehetnek numerikus állandók, mert ezek az állandók futásidőben sztringekké alakulnak. A jelenlegi kultúra befolyásolhatja a sztring-ábrázolásukat. További információ a kifejezések nyelvi referenciájábanconst
.
A rekordtípusok lezárhatják a ToStringet
A C# 10-ben hozzáadhatja a sealed
módosítót, amikor felülbírál ToString
egy rekordtípust. A metódus lezárása megakadályozza, ToString
hogy a fordító bármilyen származtatott rekordtípushoz szintetizáljon egy ToString
metódust. Az A sealed
ToString
biztosítja, hogy az összes származtatott rekordtípus a ToString
közös alaprekordtípusban definiált metódust használja. Erről a funkcióról a rekordokról szóló cikkben tudhat meg többet.
Hozzárendelés és deklaráció ugyanabban a dekonstruálásban
Ez a módosítás eltávolít egy korlátozást a C# korábbi verzióiból. Korábban a dekonstruálás minden értéket hozzárendelhetett a meglévő változókhoz, vagy inicializálhatja az újonnan deklarált változókat:
// Initialization:
(int x, int y) = point;
// assignment:
int x1 = 0;
int y1 = 0;
(x1, y1) = point;
A C# 10 eltávolítja ezt a korlátozást:
int x = 0;
(x, int y) = point;
Továbbfejlesztett határozott hozzárendelés
A C# 10 előtt számos olyan forgatókönyv volt, amikor a határozott hozzárendelés és a nullállapot-elemzés hamis pozitív figyelmeztetéseket eredményezett. Ezek általában a logikai állandókkal való összehasonlítást, a változók csak az true
utasításban vagy false
utasításokban if
való elérését, valamint a null szennyesítési kifejezéseket érintették. Ezek a példák figyelmeztetéseket generáltak a C# korábbi verzióiban, de nem a C# 10-ben:
string representation = "N/A";
if ((c != null && c.GetDependentValue(out object obj)) == true)
{
representation = obj.ToString(); // undesired error
}
// Or, using ?.
if (c?.GetDependentValue(out object obj) == true)
{
representation = obj.ToString(); // undesired error
}
// Or, using ??
if (c?.GetDependentValue(out object obj) ?? false)
{
representation = obj.ToString(); // undesired error
}
Ennek a javulásnak a fő hatása az, hogy a határozott hozzárendelésre és a nullállapot-elemzésre vonatkozó figyelmeztetések pontosabbak.
Az AsyncMethodBuilder attribútum engedélyezése metódusokon
A C# 10-es és újabb verzióiban megadhat egy másik aszinkron metódusszerkesztőt egyetlen metódushoz, amellett, hogy megadja a metódusszerkesztő típusát minden olyan metódushoz, amely egy adott feladathoz hasonló típust ad vissza. Az egyéni aszinkron metóduskészítő speciális teljesítmény-finomhangolási forgatókönyveket tesz lehetővé, ahol egy adott metódus kihasználhatja az egyéni szerkesztő előnyeit.
További információért tekintse meg a fordító által olvasott attribútumokról szóló cikk szakaszát AsyncMethodBuilder
.
CallerArgumentExpression attribútumdiagnosztika
A paraméterrel megadhatja azt a System.Runtime.CompilerServices.CallerArgumentExpressionAttribute paramétert, amelyet a fordító egy másik argumentum szövegábrázolására cserél. Ez a funkció lehetővé teszi a kódtárak számára, hogy pontosabb diagnosztikát hozzanak létre. Az alábbi kód egy feltételt tesztel. Ha a feltétel hamis, a kivételüzenet a következőnek condition
átadott argumentum szöveges ábrázolását tartalmazza:
public static void Validate(bool condition, [CallerArgumentExpression("condition")] string? message=null)
{
if (!condition)
{
throw new InvalidOperationException($"Argument failed validation: <{message}>");
}
}
Erről a funkcióról a Hívó információ attribútumairól szóló cikkben, a nyelvi referencia szakaszban talál további információt.
Továbbfejlesztett #line pragma
A C# 10 támogatja a pragma új formátumát #line
. Valószínűleg nem fogja használni az új formátumot, de látni fogja annak hatásait. A fejlesztések lehetővé teszik a tartományspecifikus nyelvek (DSL-k) részletesebb kimenetét, például a Razort. A Razor motor ezeket a fejlesztéseket használja a hibakeresési élmény javítása érdekében. A hibakeresők pontosabban emelhetik ki a Razor-forrást. Az új szintaxissal kapcsolatos további információkért tekintse meg a nyelvi referencia előfeldolgozási irányelveiről szóló cikket. A Razor-alapú példák funkcióspecifikációját is elolvashatja.