A C# 11 újdonságai
A C# 11-ben a következő funkciók lettek hozzáadva:
- Nyers sztringkonstansok
- Általános matematikai támogatás
- Általános attribútumok
- UTF-8 sztringkonstansok
- Újvonalak a sztring interpolációs kifejezéseiben
- Listaminták
- Fájl helyi típusai
- Szükséges tagok
- Automatikus alapértelmezett szerkezetek
- Mintaegyezés
Span<char>
állandónstring
- Kiterjesztett
nameof
hatókör - Numerikus intPtr
ref
mezők ésscoped ref
- Továbbfejlesztett metóduscsoport-átalakítás delegálásra
- Figyelmeztető hullám 7
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
fordynamic
.string
helyettstring?
.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
int
kell 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
ésunchecked
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ólchecked
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
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: