C#-fordító beállításai a nyelvi funkciók szabályaihoz
Az alábbi beállítások szabályozzák, hogy a fordító hogyan értelmezi a nyelvi funkciókat. Az új MSBuild szintaxis félkövér formátumban jelenik meg. A régebbi csc.exe szintaxis a .code style
- CheckForOverflowUnderflow /
-checked
: Túlcsordulási ellenőrzések létrehozása. - AllowUnsafeBlocks /
-unsafe
: A "nem biztonságos" kód engedélyezése. - DefineConstants /
-define
: Feltételes fordítási szimbólum(ok) definiálása. - LangVersion /
-langversion
: Adja meg az olyan nyelvi verziókat, mintdefault
a (legújabb főverzió) vagylatest
a (legújabb verzió, beleértve az alverziókat is). - Null értékű /
-nullable
: Null értékű környezet vagy null értékű figyelmeztetések engedélyezése.
CheckForOverflowUnderflow
A CheckForOverflowUnderflow beállítás szabályozza az alapértelmezett túlcsordulás-ellenőrzési környezetet, amely meghatározza a program viselkedését egész számtani túlcsordulások esetén.
<CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
A CheckForOverflowUnderflowtrue
esetén az alapértelmezett környezet egy ellenőrzött környezet, és a túlcsordulás ellenőrzése engedélyezve van, ellenkező esetben az alapértelmezett környezet egy nem ellenőrzött környezet. Ennek a beállításnak az false
alapértelmezett értéke az, hogy a túlcsordulás ellenőrzése le van tiltva.
A kód részeinek túlcsordulás-ellenőrzési környezetét is explicit módon szabályozhatja az és unchecked
az checked
utasítások használatával.
A túlcsordulás-ellenőrzési környezet a műveletekre és az érintett műveletekre gyakorolt hatásáról a cikkből és unchecked
az utasításokból checked
tájékozódhat.
AllowUnsafeBlocks
Az AllowUnsafeBlocks fordítóbeállítás lehetővé teszi a nem biztonságos kulcsszót használó kód fordítását. Ennek a beállításnak az alapértelmezett értéke, false
vagyis a nem biztonságos kód nem engedélyezett.
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
A nem biztonságos kódról további információt a Nem biztonságos kód és a Mutatók című témakörben talál.
DefineConstants
A DefineConstants beállítás szimbólumokat határoz meg a program összes forráskódfájljában.
<DefineConstants>name;name2</DefineConstants>
Ez a beállítás egy vagy több definiálni kívánt szimbólum nevét adja meg. A DefineConstants beállításnak ugyanaz a hatása, mint a #define előfeldolgozási irányelvnek, azzal a kivételével, hogy a fordító beállítás a projekt összes fájlja esetében érvényben van. A szimbólumok a forrásfájlban maradnak definiálva, amíg a forrásfájlban lévő #undef direktíva el nem távolítja a definíciót. Ha ezt a -define
lehetőséget választja, #undef
az egyik fájlban lévő direktíva nincs hatással a projekt más forráskódfájljaira. Az ebben a beállításban létrehozott szimbólumokat #if, #else, #elif és #endif használhatja a forrásfájlok feltételes fordításához. Maga a C#-fordító nem definiál szimbólumokat vagy makrókat, amelyeket a forráskódban használhat; minden szimbólumdefiníciónak felhasználó által definiáltnak kell lennie.
Feljegyzés
A C# #define
direktíva nem teszi lehetővé, hogy a szimbólumok értéket adjanak, például a C++-ban. Nem használható például #define
makró létrehozására vagy konstans definiálására. Ha konstanst szeretne definiálni, használjon egy változót enum
. Ha C++ stílusú makrót szeretne létrehozni, fontolja meg az olyan alternatívákat, mint az általánosak. Mivel a makrók közismerten hibalehetőséget jelentenek, a C# letiltja a használatát, de biztonságosabb alternatívákat kínál.
LangVersion
A C# fordító alapértelmezett nyelvi verziója az alkalmazás cél keretrendszerétől és a telepített SDK vagy Visual Studio verziójától függ. Ezek a szabályok a C#-nyelv verziószámozásában vannak definiálva.
A LangVersion beállítás hatására a fordító csak a megadott C# nyelvspecifikációban szereplő szintaxist fogadja el, például:
<LangVersion>9.0</LangVersion>
A következő értékek érvényesek:
Érték | Értelmezés |
---|---|
preview |
A fordító a legújabb előzetes verzió összes érvényes nyelvszintaxisát elfogadja. |
latest |
A fordító elfogadja a fordító legújabb kiadású verziójának szintaxisát (beleértve az alverziót is). |
latestMajor vagy default |
A fordító elfogadja a fordító legújabb főverziójának szintaxisát. |
12.0 |
A fordító csak a C# 12 vagy annál alacsonyabb szintaxist fogadja el. |
11.0 |
A fordító csak a C# 11 vagy annál alacsonyabb szintaxist fogadja el. |
10.0 |
A fordító csak a C# 10 vagy annál alacsonyabb szintaxist fogadja el. |
9.0 |
A fordító csak a C# 9 vagy annál alacsonyabb szintaxist fogadja el. |
8.0 |
A fordító csak a C# 8.0 vagy annál alacsonyabb szintaxist fogadja el. |
7.3 |
A fordító csak a C# 7.3 vagy annál alacsonyabb szintaxist fogadja el. |
7.2 |
A fordító csak a C# 7.2-ben vagy annál alacsonyabb szintaxist fogadja el. |
7.1 |
A fordító csak a C# 7.1 vagy annál alacsonyabb szintaxist fogadja el. |
7 |
A fordító csak a C# 7.0-s vagy újabb verziójában szereplő szintaxist fogadja el. |
6 |
A fordító csak a C# 6.0 vagy annál alacsonyabb szintaxist fogadja el. |
5 |
A fordító csak a C# 5.0-s vagy újabb verziójában szereplő szintaxist fogadja el. |
4 |
A fordító csak a C# 4.0-s vagy újabb verziójában szereplő szintaxist fogadja el. |
3 |
A fordító csak a C# 3.0-s vagy újabb verziójában szereplő szintaxist fogadja el. |
ISO-2 vagy 2 |
A fordító csak az ISO/IEC 23270:2006 C# (2.0) szabványban foglalt szintaxist fogadja el. |
ISO-1 vagy 1 |
A fordító csak az ISO/IEC 23270:2003 C# (1.0/1.2) szabványban foglalt szintaxist fogadja el. |
Fontos
Az latest
érték általában nem ajánlott. Ezzel latest
a fordító lehetővé teszi a legújabb funkciókat, még akkor is, ha ezek a funkciók a konfigurált célkeretben nem szereplő frissítésektől függnek.
Megfontolások
Annak érdekében, hogy a projekt a cél-keretrendszerhez ajánlott alapértelmezett fordítóverziót használja, ne használja a LangVersion lehetőséget. A cél keretrendszert frissítheti az újabb nyelvi funkciók eléréséhez.
A LangVersion értékének
default
megadása eltér a LangVersion beállítás kihagyásától. A beállításdefault
a fordító által támogatott nyelv legújabb verzióját használja, a cél-keretrendszer figyelembe vétele nélkül. Ha például a Visual Studio 17.6-os verziójában a .NET 6-ot célozza meg, a C# 10-et használja, ha a LangVersion nincs megadva, de a C# 11-et használja, ha a LangVersion értékedefault
.A C#-alkalmazás által hivatkozott metaadatokra nem vonatkozik a LangVersion fordítóbeállítás.
Mivel a C#-fordító minden verziója tartalmazza a nyelvi specifikációhoz tartozó bővítményeket, a LangVersion nem biztosítja a fordító egy korábbi verziójának megfelelő funkciókat.
Bár a C# verziófrissítései általában egybeesnek a fő .NET-kiadásokkal, az új szintaxis és funkciók nem feltétlenül kapcsolódnak az adott keretrendszerverzióhoz. Minden egyes funkció saját minimális .NET API-val vagy közös nyelvi futtatókörnyezeti követelményekkel rendelkezik, amelyek lehetővé teszik, hogy a NuGet-csomagokat vagy más kódtárakat is beleértve downlevel keretrendszereken fusson.
Függetlenül attól, hogy melyik LangVersion beállítást használja, használja a közös nyelvi futtatókörnyezet aktuális verzióját a .exe vagy .dll létrehozásához. Az egyik kivétel a barátszerelvények és a ModuleAssemblyName, amelyek a -langversion:ISO-1 alatt működnek.
A C# nyelvi verziójának megadására vonatkozó egyéb módokért tekintse meg a C#-nyelv verziószámozását.
A fordítóprogram programozott beállításáról további információt a következő témakörben talál LanguageVersion: .
C# nyelvspecifikáció
Verzió | Hivatkozás | Leírás |
---|---|---|
C# 8.0 és újabb verziók | PDF letöltése | C# Language Specification Version 7: .NET Foundation |
C# 7.3 | PDF letöltése | Standard ECMA-334 7. kiadás |
C# 6.0 | PDF letöltése | Standard ECMA-334 6. kiadás |
C# 5.0 | PDF letöltése | Standard ECMA-334 5. kiadás |
C# 3.0 | DOC letöltése | C# Language Specification Version 3.0: Microsoft Corporation |
C# 2.0 | PDF letöltése | Standard ECMA-334 4. kiadás |
C# 1.2 | DOC letöltése | Standard ECMA-334 2. kiadás |
C# 1.0 | DOC letöltése | Standard ECMA-334 1st Edition |
Az összes nyelvi funkció támogatásához szükséges minimális SDK-verzió
Az alábbi táblázat az SDK minimális verzióit sorolja fel a megfelelő nyelvi verziót támogató C#-fordítóval:
C# verzió | Az SDK minimális verziója |
---|---|
C# 12 | Microsoft Visual Studio/Build Tools 2022 17.8-es vagy .NET 8 SDK-s verzió |
C# 11 | Microsoft Visual Studio/Build Tools 2022 17.4-es vagy .NET 7 SDK-s verzió |
C# 10 | Microsoft Visual Studio/Build Tools 2022 vagy .NET 6 SDK |
C# 9.0 | Microsoft Visual Studio/Build Tools 2019 16.8-es vagy .NET 5 SDK-s verzió |
C# 8.0 | Microsoft Visual Studio/Build Tools 2019, 16.3 vagy .NET Core 3.0 SDK |
C# 7.3 | Microsoft Visual Studio/Build Tools 2017, 15.7-es verzió |
C# 7.2 | Microsoft Visual Studio/Build Tools 2017, 15.5-ös verzió |
C# 7.1 | Microsoft Visual Studio/Build Tools 2017, 15.3-os verzió |
C# 7.0 | Microsoft Visual Studio/Build Tools 2017 |
C# 6 | Microsoft Visual Studio/Build Tools 2015 |
C# 5 | Microsoft Visual Studio/Build Tools 2012 vagy csomagolt .NET-keretrendszer 4.5-ös fordító |
C# 4 | Microsoft Visual Studio/Build Tools 2010 vagy csomagolt .NET-keretrendszer 4.0 fordító |
C# 3 | Microsoft Visual Studio/Build Tools 2008 vagy csomagolt .NET-keretrendszer 3.5-ös fordító |
C# 2 | Microsoft Visual Studio/Build Tools 2005 vagy csomagolt .NET-keretrendszer 2.0 fordító |
C# 1.0/1.2 | Microsoft Visual Studio/Build Tools .NET 2002 vagy csomagolt .NET-keretrendszer 1.0 fordító |
Nullázható
A Null értékű beállítással megadhatja a null értékű környezetet. A következő címkével <Nullable>
állítható be a projekt konfigurációjában:
<Nullable>enable</Nullable>
Az argumentumnak az egyiknek enable
kell lennie , disable
warnings
vagy annotations
. Az enable
argumentum engedélyezi a null értékű környezetet. A beállítás disable
letiltja a null értékű környezetet. Az argumentum megadásakor warnings
a null értékű figyelmeztető környezet engedélyezve van. Az argumentum megadásakor annotations
a null értékű jegyzetkörnyezet engedélyezve van. Az értékeket a null értékű környezetekről szóló cikkben ismertetjük és ismertetjük. A null értékű migrálási stratégiákról szóló cikkünkben többet is megtudhat a null értékű hivatkozástípusok engedélyezésével kapcsolatos feladatokról egy meglévő kódbázisban.
Feljegyzés
Ha nincs értékkészlet, az alapértelmezett érték disable
lesz alkalmazva, de a .NET 6-sablonok alapértelmezés szerint a Nullable értékre vannak állítva enable
.
A folyamatelemzéssel a végrehajtható kódban lévő változók nullabilitását lehet kikövetkeztetni. A változók kikövetkezett nullabilitása független a változó deklarált nullképességétől. A metódushívások akkor is elemezve lesznek, ha feltételesen nincsenek megadva. Például kiadási Debug.Assert módban.
A következő attribútumokkal jegyzett metódusok meghívása a folyamatelemzésre is hatással lesz:
- Egyszerű előfeltételek: AllowNullAttribute és DisallowNullAttribute
- Egyszerű utólagos feltételek: MaybeNullAttribute és NotNullAttribute
- Feltételes utófeltételek: MaybeNullWhenAttribute és NotNullWhenAttribute
- DoesNotReturnIfAttribute (például
DoesNotReturnIf(false)
) Debug.Assertés DoesNotReturnAttribute - NotNullIfNotNullAttribute
- Tagsági feltételek: MemberNotNullAttribute(String) és MemberNotNullAttribute(String[])
Fontos
A globális null értékű környezet nem vonatkozik a létrehozott kódfájlokra. Ettől a beállítástól függetlenül a null értékű környezet minden létrehozottként megjelölt forrásfájl esetében le van tiltva . A fájlokat négyféleképpen lehet generáltként megjelölni:
- A .editorconfig fájlban adja meg
generated_code = true
az adott fájlra vonatkozó szakaszt. - Tegyen
<auto-generated>
vagy<auto-generated/>
írjon megjegyzést a fájl tetején. A megjegyzés bármely sorában szerepelhet, de a megjegyzésblokknak a fájl első elemének kell lennie. - Indítsa el a fájlnevet TemporaryGeneratedFile_
- Fejezze be a fájlnevet .designer.cs, .generated.cs, .g.cs vagy .g.i.cs.
A generátorok az előfeldolgozási #nullable
irányelv használatával is bejelentkezhetnek.
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: