C#-compileropties voor taalfunctieregels

Met de volgende opties bepaalt u hoe de compiler taalfuncties interpreteert. De nieuwe MSBuild-syntaxis wordt vet weergegeven. De oudere csc.exe syntaxis wordt weergegeven in code style.

  • CheckForOverflowUnderflow / -checked: Overloopcontroles genereren.
  • AllowUnsafeBlocks / -unsafe: 'onveilige' code toestaan.
  • DefineConstants / -define: voorwaardelijke compilatiesymbolen definiëren.
  • LangVersion / -langversion: geef taalversie op, zoals default (meest recente primaire versie) of latest (meest recente versie, inclusief secundaire versies).
  • Nullable / -nullable: schakel nullable context of nullable waarschuwingen in.

CheckForOverflowUnderflow

Met de optie CheckForOverflowUnderflow wordt de standaardcontext voor overloopcontrole bepaald die het gedrag van het programma definieert als rekenkundige gehele getallen overlopen.

<CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>

Wanneer CheckForOverflowUnderflow is, is truede standaardcontext een gecontroleerde context en is overloopcontrole ingeschakeld. Anders is de standaardcontext een niet-gecontroleerde context. De standaardwaarde voor deze optie is falsedat overloopcontrole is uitgeschakeld.

U kunt ook expliciet de context voor overloopcontrole voor de onderdelen van uw code beheren met behulp van de checked en unchecked instructies.

Zie het artikel over checked en instructies voor informatie over hoe de context voor overloopcontrole van invloed is op bewerkingen en unchecked welke bewerkingen worden beïnvloed.

AllowUnsafeBlocks

De optie AllowUnsafeBlocks compiler staat code toe die gebruikmaakt van het onveilige trefwoord om te compileren. De standaardwaarde voor deze optie is false, wat betekent dat onveilige code niet is toegestaan.

<AllowUnsafeBlocks>true</AllowUnsafeBlocks>

Zie Onveilige code en aanwijzers voor meer informatie over onveilige code.

DefineConstants

De optie DefineConstants definieert symbolen in alle broncodebestanden van uw programma.

<DefineConstants>name;name2</DefineConstants>

Met deze optie geeft u de namen op van een of meer symbolen die u wilt definiëren. De optie DefineConstants heeft hetzelfde effect als de #define preprocessor-instructie, behalve dat de compileroptie van kracht is voor alle bestanden in het project. Een symbool blijft gedefinieerd in een bronbestand totdat een #undef instructie in het bronbestand de definitie verwijdert. Wanneer u de -define optie gebruikt, heeft een #undef instructie in het ene bestand geen effect op andere broncodebestanden in het project. U kunt symbolen die met deze optie zijn gemaakt, gebruiken met #if, #else, #elif en #endif om bronbestanden voorwaardelijk te compileren. De C#-compiler zelf definieert geen symbolen of macro's die u in uw broncode kunt gebruiken; alle symbooldefinities moeten door de gebruiker zijn gedefinieerd.

Notitie

De C# #define -instructie staat niet toe dat een symbool een waarde krijgt, zoals in talen zoals C++. Kan bijvoorbeeld #define niet worden gebruikt om een macro te maken of om een constante te definiëren. Als u een constante wilt definiëren, gebruikt u een enum variabele. Als u een C++-stijlmacro wilt maken, kunt u alternatieven zoals generieken overwegen. Omdat macro's berucht foutgevoelig zijn, wordt het gebruik door C# niet toegestaan, maar bieden ze veiligere alternatieven.

LangVersion

De standaardtaalversie voor de C#-compiler is afhankelijk van het doelframework voor uw toepassing en de versie van de SDK of Visual Studio die is geïnstalleerd. Deze regels worden gedefinieerd in C#-taalversiebeheer.

De optie LangVersion zorgt ervoor dat de compiler alleen syntaxis accepteert die is opgenomen in de opgegeven C#-taalspecificatie, bijvoorbeeld:

<LangVersion>9.0</LangVersion>

De volgende waarden zijn geldig:

Weergegeven als Betekenis
preview De compiler accepteert alle geldige taalsyntaxis uit de nieuwste preview-versie.
latest De compiler accepteert syntaxis van de meest recente uitgebrachte versie van de compiler (inclusief secundaire versie).
latestMajor
of default
De compiler accepteert syntaxis van de meest recente primaire versie van de compiler.
12.0 De compiler accepteert alleen syntaxis die is opgenomen in C# 12 of lager.
11.0 De compiler accepteert alleen syntaxis die is opgenomen in C# 11 of lager.
10.0 De compiler accepteert alleen syntaxis die is opgenomen in C# 10 of lager.
9.0 De compiler accepteert alleen syntaxis die is opgenomen in C# 9 of lager.
8.0 De compiler accepteert alleen syntaxis die is opgenomen in C# 8.0 of lager.
7.3 De compiler accepteert alleen syntaxis die is opgenomen in C# 7.3 of lager.
7.2 De compiler accepteert alleen syntaxis die is opgenomen in C# 7.2 of lager.
7.1 De compiler accepteert alleen syntaxis die is opgenomen in C# 7.1 of lager.
7 De compiler accepteert alleen syntaxis die is opgenomen in C# 7.0 of lager.
6 De compiler accepteert alleen syntaxis die is opgenomen in C# 6.0 of lager.
5 De compiler accepteert alleen syntaxis die is opgenomen in C# 5.0 of lager.
4 De compiler accepteert alleen syntaxis die is opgenomen in C# 4.0 of lager.
3 De compiler accepteert alleen syntaxis die is opgenomen in C# 3.0 of lager.
ISO-2
of 2
De compiler accepteert alleen syntaxis die is opgenomen in ISO/IEC 23270:2006 C# (2.0).
ISO-1
of 1
De compiler accepteert alleen syntaxis die is opgenomen in ISO/IEC 23270:2003 C# (1.0/1.2).

Belangrijk

De latest waarde wordt over het algemeen niet aanbevolen. Met latestde compiler worden de nieuwste functies ingeschakeld, zelfs als deze functies afhankelijk zijn van updates die niet zijn opgenomen in het geconfigureerde doelframework.

Overwegingen

  • Gebruik de optie LangVersion niet om ervoor te zorgen dat uw project gebruikmaakt van de standaardversie van de compiler die wordt aanbevolen voor uw doelframework. U kunt het doelframework bijwerken voor toegang tot nieuwere taalfuncties.

  • Het opgeven van LangVersion met de default waarde verschilt van het weglaten van de optie LangVersion . default Opgeven maakt gebruik van de nieuwste versie van de taal die de compiler ondersteunt, zonder rekening te houden met het doelframework. Als u bijvoorbeeld een project bouwt dat is gericht op .NET 6 van Visual Studio versie 17.6, wordt C# 10 gebruikt als LangVersion niet is opgegeven, maar C# 11 gebruikt als LangVersion is ingesteld op default.

  • Metagegevens waarnaar wordt verwezen door uw C#-toepassing, zijn niet onderhevig aan de optie LangVersion-compiler .

  • Omdat elke versie van de C#-compiler extensies bevat voor de taalspecificatie, biedt LangVersion u niet de equivalente functionaliteit van een eerdere versie van de compiler.

  • Hoewel C#-versie-updates over het algemeen samenvallen met belangrijke .NET-releases, zijn de nieuwe syntaxis en functies niet noodzakelijkerwijs gekoppeld aan die specifieke frameworkversie. Elke specifieke functie heeft een eigen minimale .NET-API of algemene taalruntimevereisten waarmee deze kan worden uitgevoerd op frameworks op downlevel door NuGet-pakketten of andere bibliotheken op te halen.

  • Ongeacht welke LangVersion-instelling u gebruikt, gebruikt u de huidige versie van de algemene taalruntime om uw .exe of .dll te maken. Een uitzondering hierop zijn vriendenassemblyName en ModuleAssemblyName, die werken onder -langversion:ISO-1.

Zie C#-taalversies voor andere manieren om de C#-taalversie op te geven.

Zie voor meer informatie over het programmatisch LanguageVersioninstellen van deze compileroptie.

C#-taalspecificatie

Versie Koppeling Beschrijving
C# 8.0 en hoger PDF downloaden C#-taalspecificatie versie 7: .NET Foundation
C# 7.3 PDF downloaden Standaard ECMA-334 7e editie
C# 6.0 PDF downloaden Standaard ECMA-334 6e editie
C# 5.0 PDF downloaden Standaard ECMA-334 5e editie
C# 3.0 DOC downloaden C#-taalspecificatie versie 3.0: Microsoft Corporation
C# 2.0 PDF downloaden Standaard ECMA-334 4e editie
C# 1.2 DOC downloaden Standaard ECMA-334 2e editie
C# 1.0 DOC downloaden Standaard ECMA-334 1e editie

Minimale SDK-versie die nodig is om alle taalfuncties te ondersteunen

De volgende tabel bevat de minimale versies van de SDK met de C#-compiler die ondersteuning biedt voor de bijbehorende taalversie:

C#-versie Minimale SDK-versie
C# 12 Microsoft Visual Studio/Build Tools 2022 versie 17.8 of .NET 8 SDK
C# 11 Microsoft Visual Studio/Build Tools 2022 versie 17.4 of .NET 7 SDK
C# 10 Microsoft Visual Studio/Build Tools 2022 of .NET 6 SDK
C# 9.0 Microsoft Visual Studio/Build Tools 2019 versie 16.8 of .NET 5 SDK
C# 8.0 Microsoft Visual Studio/Build Tools 2019, versie 16.3 of .NET Core 3.0 SDK
C# 7.3 Microsoft Visual Studio/Build Tools 2017, versie 15.7
C# 7.2 Microsoft Visual Studio/Build Tools 2017, versie 15.5
C# 7.1 Microsoft Visual Studio/Build Tools 2017, versie 15.3
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 of gebundelde .NET Framework 4.5-compiler
C# 4 Microsoft Visual Studio/Build Tools 2010 of gebundelde .NET Framework 4.0-compiler
C# 3 Microsoft Visual Studio/Build Tools 2008 of gebundelde .NET Framework 3.5-compiler
C# 2 Microsoft Visual Studio/Build Tools 2005 of gebundelde .NET Framework 2.0-compiler
C# 1.0/1.2 Microsoft Visual Studio/Build Tools .NET 2002 of gebundelde .NET Framework 1.0-compiler

Null-waarde toegestaan

Met de optie Null kunt u de context opgeven die null kan worden gebruikt. Deze kan worden ingesteld in de configuratie van het project met behulp van de <Nullable> tag:

<Nullable>enable</Nullable>

Het argument moet een van enable, disableof warnings.annotations Het enable argument maakt de nullable context mogelijk. Als u disable opgeeft, wordt de null-context uitgeschakeld. Wanneer u het warnings argument opgeeft, wordt de context voor null-waarschuwingen ingeschakeld. Wanneer u het annotations argument opgeeft, wordt de context van de null-aantekening ingeschakeld. De waarden worden beschreven en uitgelegd in het artikel over null-contexten. Meer informatie over de taken die betrokken zijn bij het inschakelen van null-referentietypen in een bestaande codebasis in ons artikel over strategieën voor null-migratie.

Notitie

Wanneer er geen waarde is ingesteld, wordt de standaardwaarde disable toegepast, maar de .NET 6-sjablonen worden standaard geleverd met de waarde Null die is ingesteld op enable.

Stroomanalyse wordt gebruikt om de null-waarde van variabelen in uitvoerbare code af te stellen. De uitgestelde null-waarde van een variabele is onafhankelijk van de gedeclareerde null-waarde van de variabele. Methode-aanroepen worden geanalyseerd, zelfs wanneer ze voorwaardelijk worden weggelaten. Bijvoorbeeld Debug.Assert in de releasemodus.

Het aanroepen van methoden met aantekeningen met de volgende kenmerken heeft ook invloed op stroomanalyse:

Belangrijk

De globale null-context is niet van toepassing op gegenereerde codebestanden. Ongeacht deze instelling is de null-context uitgeschakeld voor elk bronbestand dat is gemarkeerd als gegenereerd. Er zijn vier manieren waarop een bestand wordt gemarkeerd als gegenereerd:

  1. Geef generated_code = true in de .editorconfig een sectie op die van toepassing is op dat bestand.
  2. Plaats <auto-generated> of <auto-generated/> in een opmerking boven aan het bestand. Het kan op elke regel in die opmerking staan, maar het opmerkingenblok moet het eerste element in het bestand zijn.
  3. Start de bestandsnaam met TemporaryGeneratedFile_
  4. Beëindig de bestandsnaam met .designer.cs, .generated.cs, .g.cs of .g.i.cs.

Generatoren kunnen zich aanmelden met behulp van de #nullable preprocessorrichtlijn.