A C# 10 újdonságai

A C# 10 a következő funkciókat és fejlesztéseket adja hozzá a C# nyelvhez:

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:

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 sealedToString 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.