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: Code toestaan unsafe .
  • 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.

Notitie

Zie Compiler-opties voor meer informatie over het configureren van deze opties voor uw project.

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. Wanneer CheckForOverflowUnderflow is, is falsede standaardcontext een niet-gecontroleerd context. De standaardwaarde voor deze optie is false, wat betekent dat overloopcontrole is uitgeschakeld.

U kunt ook expliciet de overloopcontrolecontext voor delen van uw code beheren met behulp van de checked en unchecked instructies.

Zie het artikel over checked en unchecked instructies voor informatie over hoe de context voor overloopcontrole bewerkingen beïnvloedt en welke bewerkingen deze beïnvloedt.

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.

De bijgewerkte regels voor geheugenveiligheid inschakelen

De bijgewerkte regels voor geheugenveiligheid zijn een preview-functie in C# 15 en .NET 11. Ze gebruiken twee onafhankelijke compilerinstellingen:

  • De preview taalversie maakt de nieuwe syntaxis en aanwijzer-ontspanning mogelijk.
  • De updated-memory-safety-rules compilerfunctie maakt de bijgewerkte regels mogelijk, inclusief verplichtingen voor onveilige aanroepers, en zorgt ervoor dat de compiler de keuze in de assembly met het MemorySafetyRulesAttribute kenmerk vastlegt.

Een toekomstige stabiele SDK-eigenschap, MemorySafetyRulesis gepland als een derde activeringslaag voor wanneer de functie preview verlaat (bijvoorbeeld <MemorySafetyRules>2</MemorySafetyRules>), maar die eigenschap nog niet is geïmplementeerd.

Gebruik voor een project beide instellingen:

<PropertyGroup>
  <LangVersion>preview</LangVersion>
  <Features>$(Features);updated-memory-safety-rules</Features>
</PropertyGroup>

Voeg voor een programma op basis van bestanden de equivalente instructies toe:

#:property Features=$(Features);updated-memory-safety-rules
#:property LangVersion=preview

De eigenschap AllowUnsafeBlocks is onafhankelijk. Hiermee bepaalt u of de bron het unsafe trefwoord kan gebruiken. Een project kan de bijgewerkte regels inschakelen zonder onveilige code toe te staan. In dat geval ontvangt het fouten wanneer er onveilige API's worden aangeroepen.

Of de ene assembly de bijgewerkte regels afdwingt op basis van een andere, hangt af van de kant waarin wordt gekozen:

  • Bijgewerkte modelaanroeper, bijgewerkte modeloproep: de markeringen van unsafe de gebelde gebruiker worden door metagegevens verzonden. De beller verpakt elke aanroep naar een vereist onveilig lid in een unsafe blok.
  • Caller van het bijgewerkte model, oorspronkelijke modelaanroep: Een compatibiliteitsmodus behandelt elk lid met een aanwijzertype in de handtekening, omdat dit onveilig is, zodat de oproepsite een omsluitblok unsafe nodig heeft. In deze modus blijft een api op basis van een aanwijzer op de achtergrond verloren unsafe .
  • Caller van origineel model, bijgewerkte modelaanroep: de oorspronkelijke aanwijzerregels zijn nog steeds van toepassing. Een vereist onveilig lid dat geen aanwijzertype in de handtekening heeft, kan worden aangeroepen vanuit veilige code, omdat de aanroeper van het oorspronkelijke model de nieuwe markeringen niet kan lezen.

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 heeft, zoals in talen zoals C++. U kunt bijvoorbeeld #define geen macro maken of een constante 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.

Waarschuwing

Stel het LangVersion element niet in op latest. De latest instelling betekent dat de geïnstalleerde compiler de nieuwste versie gebruikt. Deze versie kan veranderen van machine naar machine, waardoor builds onbetrouwbaar zijn. Daarnaast worden taalfuncties ingeschakeld waarvoor runtime- of bibliotheekfuncties zijn vereist die niet zijn opgenomen in de huidige SDK.

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

<LangVersion>9.0</LangVersion>

Voor sommige preview-functies is een afzonderlijke opt-in vereist, naast <LangVersion>preview</LangVersion>. De C# 15 bijgewerkte regels voor geheugenveiligheid maken bijvoorbeeld gebruik van de updated-memory-safety-rules compilerfunctie. Zie De bijgewerkte regels voor geheugenveiligheid inschakelen voor meer informatie.

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.
15.0 De compiler accepteert alleen syntaxis die is opgenomen in C# 15 of lager.
14.0 De compiler accepteert alleen syntaxis die is opgenomen in C# 14 of lager.
13.0 De compiler accepteert alleen syntaxis die is opgenomen in C# 13 of lager.
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).

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. Werk het doelframework bij 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.

  • De optie LangVersion-compiler heeft geen invloed op metagegevens waarnaar wordt verwezen door uw C#-toepassing.

  • 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 runtimevereisten voor taal waarmee deze kan worden uitgevoerd op frameworks op down-level 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

Gebruik de optie Nullable om de context op te geven die null kan worden gebruikt. Stel deze in de configuratie van het project in met behulp van de <Nullable> tag:

<Nullable>enable</Nullable>

Het argument moet een van enable, disableof warnings.annotations Met enable het argument wordt de null-context ingeschakeld. Met disable het argument wordt de null-context uitgeschakeld. Met warnings het argument wordt de context voor null-waarschuwingen ingeschakeld. Met annotations het argument wordt de context voor null-aantekening ingeschakeld. Zie Null-contexten voor meer informatie over deze waarden. Zie de strategieën voor null-migratie voor meer informatie over het inschakelen van null-referentietypen in een bestaande codebasis.

Notitie

Als u geen waarde instelt, is disablede standaardwaarde . Bij .NET 6 en nieuwere sjablonen wordt de waardeenable null standaard ingesteld.

Stroomanalyse bepaalt de null-waarde van variabelen binnen uitvoerbare code. De uitgestelde null-waarde van een variabele is onafhankelijk van de gedeclareerde null-waarde van de variabele. De compiler analyseert methode-aanroepen, zelfs wanneer de aanroep voorwaardelijk wordt weggelaten uit de gecompileerde uitvoer. De compiler analyseert bijvoorbeeld nog steeds een aanroep naar Debug.Assert null-beschikbaarheid, ook al is de aanroep voorwaardelijk en wordt deze niet gecompileerd in releaseversies.

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

Belangrijk

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

  1. Geef generated_code = true in de .editorconfig een sectie op die van toepassing is op dat bestand.
  2. Voeg <auto-generated> een opmerking toe aan de bovenkant van het bestand of <auto-generated/> voeg deze toe. U kunt deze op elke regel in de opmerking plaatsen, 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.