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


A C# 11 újdonságai

A C# 11-ben a következő funkciók lettek hozzáadva:

A C# 11 támogatott a .NET 7-ben. További információ: C# nyelvi verziószámozás.

A .NET letöltési oldaláról letöltheti a legújabb .NET 7 SDK-t. Letöltheti a Visual Studio 2022-t is, amely tartalmazza a .NET 7 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 .

Általános attribútumok

Deklarálhat egy általános osztályt, amelynek alaposztálya .System.Attribute Ez a funkció kényelmesebb szintaxist biztosít a paramétert System.Type igénylő attribútumokhoz. Korábban létre kell hoznia egy attribútumot, amely konstruktorparaméterként szolgál Type :

// Before C# 11:
public class TypeAttribute : Attribute
{
   public TypeAttribute(Type t) => ParamType = t;

   public Type ParamType { get; }
}

Az attribútum alkalmazásához használja az operátort typeof :

[TypeAttribute(typeof(string))]
public string Method() => default;

Az új funkció használatával ehelyett létrehozhat egy általános attribútumot:

// C# 11 feature:
public class GenericAttribute<T> : Attribute { }

Ezután adja meg az attribútumot használni kívánt típusparamétert:

[GenericAttribute<string>()]
public string Method() => default;

Az attribútum alkalmazásakor meg kell adnia az összes típusparamétert. Más szóval az általános típust teljes egészében fel kell építeni. A fenti példában az üres zárójelek (( és )) elhagyhatók, mivel az attribútum nem tartalmaz argumentumokat.

public class GenericType<T>
{
   [GenericAttribute<T>()] // Not allowed! generic attributes must be fully constructed types.
   public string Method() => default;
}

A típusargumentumoknak ugyanazokat a korlátozásokat kell teljesíteniük, mint az typeof operátornak. A metaadat-megjegyzéseket igénylő típusok nem engedélyezettek. Például a következő típusok nem engedélyezettek típusparaméterként:

  • dynamic
  • string? (vagy bármely null értékű hivatkozástípus)
  • (int X, int Y) (vagy bármely más, C# tuple szintaxist használó rekordtípus).

Ezek a típusok nem jelennek meg közvetlenül a metaadatokban. Ezek a típust leíró széljegyzeteket tartalmaznak. Minden esetben használhatja a mögöttes típust:

  • object for dynamic.
  • string helyett string?.
  • ValueTuple<int, int> helyett (int X, int Y).

Általános matematikai támogatás

Az általános matematikai támogatást számos nyelvi funkció teszi lehetővé:

  • static virtual tagok a felületeken
  • ellenőrzött felhasználó által definiált operátorok
  • ellazult műszak operátorok
  • nem aláírt jobb műszakos operátor

Az illesztőkben hozzáadhat vagy static virtual tagokat is megadhatstatic abstract, amelyek túlterhelhető operátorokat, egyéb statikus tagokat és statikus tulajdonságokat tartalmaznak. Ennek a funkciónak az elsődleges forgatókönyve a matematikai operátorok általános típusokban való használata. Például implementálhatja az System.IAdditionOperators<TSelf, TOther, TResult> interfészt egy implementálható operator +típusban. Más interfészek más matematikai műveleteket vagy jól definiált értékeket határoznak meg. A felületekről szóló cikkben megismerheti az új szintaxist. A metódusokat tartalmazó static virtual felületek általában általános interfészek. Emellett a legtöbben azt a kényszert is deklarálják, hogy a típusparaméter implementálja a deklarált felületet.

Az oktatóanyagban többet is megtudhat a funkcióról, és kipróbálhatja a statikus absztrakt felület tagjait, illetve a .NET 6 előzetes verziójú funkcióit – általános matematikai blogbejegyzést.

Az általános matematika más követelményeket is létrehozott a nyelvre vonatkozóan.

  • nem aláírt jobb műszak operátora: A C# 11 előtt, ha egy nem aláírt jobb műszakot szeretne kényszeríteni, minden aláírt egész számot le kell írnia egy aláíratlan típusra, el kell végeznie a műszakot, majd vissza kell adnia az eredményt egy aláírt típusra. A C# 11-től kezdődően használhatja a >>>nem aláírt műszak operátort.
  • ellazult műszakoperátorra vonatkozó követelmények: A C# 11 eltávolítja azt a követelményt, hogy a második operandusnak egy vagy implicit módon átalakíthatónak intkell lennieint. Ez a módosítás lehetővé teszi az általános matematikai interfészeket implementáló típusok használatát ezeken a helyeken.
  • bejelölt és nem ellenőrzött felhasználó által definiált operátorok: A fejlesztők mostantól definiálhatnak checked és unchecked aritmetikai operátorokat. A fordító az aktuális környezet alapján a megfelelő változathoz hoz létre hívásokat. Az operátorokról checked az aritmetikai operátorokról szóló cikkben olvashat bővebben.

Numerikus IntPtr és UIntPtr

Az nint és nuint a típusok mostantól aliasok System.IntPtr és System.UIntPtr, illetve.

Newlines in string interpolations

A sztring interpolációjának szövege { és } karakterei mostantól több sorra is kiterjedhetnek. A jelölők és } a { jelölők közötti szöveg C#-ként van elemezve. Bármely jogi C#, beleértve az új vonalakat is, engedélyezett. Ezzel a funkcióval könnyebben olvashatók a hosszabb C#-kifejezéseket használó sztringinterpolációk, például mintamegfelelő switch kifejezések vagy LINQ-lekérdezések.

A sztringinterpolációk cikkének újvonalak funkciójáról a nyelvi hivatkozásban talál további információt.

Listaminták

A listaminták kiterjesztik a lista vagy tömb elemeinek sorozatainak megfelelő mintát. Például akkor, sequence is [1, 2, 3]true ha a sequence tömb vagy három egész számból álló lista (1, 2 és 3). Az elemek bármilyen mintával egyeztethetők, beleértve az állandót, a típust, a tulajdonságot és a relációs mintákat. Az elvetési minta (_) egyetlen elemnek felel meg, az új tartományminta (..) pedig a nulla vagy több elem sorozatának felel meg.

A listamintákkal kapcsolatos további részleteket a nyelvi referencia mintamegfeleltetési cikkében talál.

Továbbfejlesztett metóduscsoport-átalakítás delegálásra

A metóduscsoport-átalakítások C#-szabványa a következő elemet tartalmazza:

  • Az átalakítás engedélyezett (de nem kötelező) egy meglévő delegált példány használatára, amely már tartalmazza ezeket a hivatkozásokat.

A szabvány korábbi verziói megtiltották, hogy a fordító újrahasználja a metóduscsoport-átalakításhoz létrehozott delegált objektumot. A C# 11 fordító gyorsítótárazza a metóduscsoport-átalakításból létrehozott delegált objektumot, és újra felhasználja az egyetlen delegált objektumot. Ez a funkció először a Visual Studio 2022 17.2-es verziójában volt elérhető előzetes verzióként, és a .NET 7 Preview 2-ben.

Nyers sztringkonstansok

A nyers sztringkonstansok a sztringkonstansok új formátumai. A nyers sztringkonstansok tetszőleges szöveget tartalmazhatnak, beleértve a szóközöket, az új sorokat, a beágyazott idézőjeleket és más speciális karaktereket anélkül, hogy feloldósorozatokat kellene használniuk. A nyers sztringkonstans legalább három dupla idézőjellel (""") kezdődik. Ugyanazzal a számú dupla idézőjellel végződik. A nyers sztringkonstans általában három dupla idézőjelet használ egyetlen sorban a sztring elindításához, a sztring befejezéséhez pedig három dupla idézőjelet egy külön sorban. A nyitó idézőjelet követő és a záró idézőjelet megelőző új vonalak nem szerepelnek a végleges tartalomban:

string longMessage = """
    This is a long message.
    It has several lines.
        Some are indented
                more than others.
    Some should start at the first column.
    Some have "quoted text" in them.
    """;

A záró dupla idézőjelek bal oldalán található üres szóközök törlődnek a sztringkonstansból. A nyers sztringkonstansok sztringinterpolációval kombinálhatók, hogy a kimeneti szövegben kapcsos zárójelek szerepeljenek. Több $ karakter jelzi, hogy hány egymást követő zárójel kezdődik és fejeződik be az interpoláció:

var location = $$"""
   You are at {{{Longitude}}, {{Latitude}}}
   """;

Az előző példa azt határozza meg, hogy két kapcsos zárójel induljon el és fejezz be egy interpolációt. A kimeneti sztring tartalmazza a harmadik ismétlődő nyitó és záró kapcsos zárójelet.

A programozási útmutatóban a sztringekről szóló cikkben a nyers sztringkonstansokról, valamint a sztringkonstansokról és az interpolált sztringekről szóló nyelvi referenciacikkekről tudhat meg többet.

Automatikus alapértelmezett struktúra

A C# 11 fordító biztosítja, hogy egy struct típus összes mezője inicializálva legyen az alapértelmezett értékre egy konstruktor végrehajtása során. Ez a változás azt jelenti, hogy a fordító automatikusan inicializál minden olyan mezőt vagy automatikus tulajdonságot, amelyet nem inicializál egy konstruktor. Azokat a szerkezeteket, amelyeknél a konstruktor nem rendeli hozzá az összes mezőt most lefordítva, és a nem explicit módon inicializált mezők az alapértelmezett értékre vannak beállítva. A szerkezetekről szóló cikkben további információt olvashat arról, hogy ez a változás hogyan befolyásolja a szerkezetek inicializálását.

Mintaegyezés Span<char> vagy ReadOnlySpan<char> állandó string

Tesztelhette, hogy volt-e string egy adott állandó érték több kiadáshoz tartozó mintaegyeztetés használatával. Most ugyanazt a mintát egyező logikát használhatja olyan változókkal, amelyek vagy ReadOnlySpan<char>.Span<char>

Hatókör kiterjesztett neve

A típusparaméterek nevei és paraméternevei mostantól hatókörbe tartoznak, ha az nameof adott metódus attribútumdeklarációjában használt kifejezésben használják. Ez a funkció azt jelenti, hogy az nameof operátorral megadhatja egy metódusparaméter nevét egy attribútumban a metóduson vagy paraméterdeklaráción. Ez a funkció leggyakrabban akkor hasznos, ha attribútumokat ad hozzá a null értékű elemzéshez.

UTF-8 sztringkonstansok

Az UTF-8 karakterkódolás megadásához megadhatja a u8 sztringkonstans utótagját. Ha az alkalmazásnak UTF-8 sztringekre van szüksége, HTTP-sztring-állandókhoz vagy hasonló szöveges protokollokhoz, ezzel a funkcióval egyszerűsítheti az UTF-8 sztringek létrehozását.

Az UTF-8 sztringkonstansokról a cikk sztringkonstans szakaszában talál további információt a beépített referenciatípusokról.

Szükséges tagok

A módosító tulajdonságokhoz required és mezőkhöz is hozzáadható, hogy konstruktorokat és hívókat kényszerítsen az értékek inicializálására. A System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute konstruktorokhoz hozzáadható, hogy tájékoztassa a fordítót arról, hogy egy konstruktor inicializálja az összes szükséges tagot.

A szükséges tagokról további információt a tulajdonságokról szóló cikk init-only szakaszában talál.

ref mezők és ref scoped változók

Mezőket deklarálhat ref egy ref struct. Ez olyan típusokat támogat, mint System.Span<T> például a speciális attribútumok nélküli vagy a rejtett belső típusok.

A módosító bármely scoped deklarációhoz ref hozzáadható. Ez korlátozza azt a hatókört, amelybe a hivatkozás kerülhet.

Fájl helyi típusai

A C# 11-től kezdődően a file hozzáférés-módosító használatával létrehozhat egy típust, amelynek láthatósága a deklarált forrásfájlra terjed ki. Ez a funkció segít a forrásgenerátor szerzőinek az elnevezési ütközések elkerülésében. Erről a funkcióról a nyelvi referencia fájlhatókörű típusairól szóló cikkben olvashat bővebben.

Lásd még