Tillförlitlighetsregler
Tillförlitlighetsregler stöder biblioteks- och programtillförlitlighet, till exempel korrekt minnes- och trådanvändning. Tillförlitlighetsreglerna omfattar:
Regel | Beskrivning |
---|---|
CA2000: Ta bort objekt innan du förlorar omfånget | Eftersom en exceptionell händelse kan inträffa som hindrar slutföraren av ett objekt från att köras, bör objektet uttryckligen tas bort innan alla referenser till det ligger utanför omfånget. |
CA2002: Lås inte objekt med svag identitet | Ett objekt sägs ha en svag identitet när det kan nås direkt över programdomängränser. En tråd som försöker hämta ett lås på ett objekt som har en svag identitet kan blockeras av en andra tråd i en annan programdomän som har ett lås på samma objekt. |
CA2007: Vänta inte direkt på en uppgift | En asynkron metod väntar en Task direkt. |
CA2008: Skapa inte aktiviteter utan att skicka en TaskScheduler- | En aktivitetsskapande eller fortsättningsåtgärd använder en metodöverbelastning som inte anger en TaskScheduler parameter. |
CA2009: Anropa inte ToImmutableCollection på ett ImmutableCollection-värde |
ToImmutable -metoden anropades i onödan för en oföränderlig samling från System.Collections.Immutable namnrymd. |
CA2011: Tilldela inte egenskapen i dess | En egenskap tilldelades av misstag ett värde inom sin egen ange. |
CA2012: Använd ValueTasks korrekt | ValueTasks som returneras från medlemsanrop är avsedda att inväntas direkt. Försök att använda en ValueTask flera gånger eller att direkt komma åt resultatet innan det är känt att det är klart kan leda till ett undantag eller skada. Att ignorera en sådan ValueTask är sannolikt en indikation på en funktionell bugg och kan försämra prestanda. |
CA2013: Använd inte ReferenceEquals med värdetyper | När du jämför värden med System.Object.ReferenceEquals, om objA och objB är värdetyper, boxas de innan de skickas till metoden ReferenceEquals. Det innebär att även om både objA och objB representerar samma instans av en värdetyp returnerar metoden ReferenceEquals ändå false. |
CA2014: Använd inte stackalloc i loopar. | Stackutrymme som allokeras av en stackalloc frigörs endast i slutet av den aktuella metodens anrop. Om du använder den i en loop kan det leda till obundna stacktillväxt och eventuella stacköverflödesvillkor. |
CA2015: Definiera inte finalizers för typer som härleds från MemoryManager<T> | Om du lägger till en finalizer i en typ som härletts från MemoryManager<T> kan det tillåta att minnet frigörs medan det fortfarande används av en Span<T>. |
CA2016: Vidarebefordra parametern CancellationToken till metoder som tar en | Vidarebefordra CancellationToken -parametern till metoder som tar en för att säkerställa att meddelanden om åtgärdsavbokning sprids korrekt eller skicka CancellationToken.None uttryckligen för att indikera att token avsiktligt inte sprids. |
CA2017: Felmatchning av antal parametrar | Antalet parametrar som anges i mallen för loggningsmeddelande matchar inte antalet namngivna platshållare. |
CA2018: Argumentet count att Buffer.BlockCopy ska ange antalet byte som ska kopieras |
När du använder Buffer.BlockCopy anger argumentet count antalet byte som ska kopieras. Du bör bara använda Array.Length för argumentet count på matriser vars element är exakt en byte i storlek.
byte , sbyte och bool matriser har element som är en byte i storlek. |
CA2019: ThreadStatic fält bör inte använda infogad initiering |
Ett fält som kommenteras med ThreadStaticAttribute initieras infogat eller explicit i en static (Shared i Visual Basic) konstruktor. |
CA2020: Förhindra beteendeförändringar som orsakas av inbyggda operatorer av IntPtr/UIntPtr | Vissa inbyggda operatorer som lagts till i .NET 7 fungerar annorlunda än de användardefinierade operatorerna i .NET 6 och tidigare versioner. Vissa operatorer som brukade kasta i omarkerad kontext när de svämmade över genererar inte längre om de inte omsluts i en markerad kontext. Vissa operatorer som tidigare inte kastade i markerad kontext genererar nu såvida de inte omsluts i en omarkerad kontext. |
CA2021: Anropa inte Enumerable.Cast<T> eller Enumerable.OfType<T> med inkompatibla typer | Ett anrop till Enumerable.Cast<TResult>(IEnumerable) eller Enumerable.OfType<TResult>(IEnumerable) anger en typparameter som inte är kompatibel med typen av indatasamling. |
CA2022: Undvik att läsa inexact med Stream.Read | Ett anrop till Stream.Read kan returnera färre byte än begärt, vilket resulterar i otillförlitlig kod om returvärdet inte är markerat. |
CA2024: Använd inte StreamReader.EndOfStream i asynkrona metoder | Egenskapen StreamReader.EndOfStream kan orsaka oavsiktlig synkron blockering när inga data buffrats. Använd i stället StreamReader.ReadLineAsync() direkt, vilket returnerar null när du når slutet av strömmen. |
Samarbeta med oss på GitHub
Källan för det här innehållet finns på GitHub, där du även kan skapa och granska ärenden och pull-begäranden. Se vår deltagarguide för mer information.