Freigeben über


Zuverlässigkeitsregeln

Zuverlässigkeitsregeln unterstützen Bibliotheks- und Anwendungssicherheit, z. B. die korrekte Speicher- und Threadverwendung. Zu den Zuverlässigkeitsregeln gehören:

Regel Beschreibung
CA2000: Dispose objects before losing scope Da ein außergewöhnliches Ereignis auftreten kann, das verhindert, dass der Abschluss eines Objekts ausgeführt wird, sollte das Objekt explizit verworfen werden, bevor alle Verweise darauf außerhalb des Gültigkeitsbereichs liegen.
CA2002: Sperren Sie keine Objekte mit schwacher Identität Ein Objekt soll eine schwache Identität aufweisen, wenn über Anwendungsdomänengrenzen hinweg direkt darauf zugegriffen werden kann. Ein Thread, der versucht, eine Sperre für ein Objekt abzurufen, das eine schwache Identität aufweist, kann von einem zweiten Thread in einer anderen Anwendungsdomäne blockiert werden, die über eine Sperre für dasselbe Objekt verfügt.
CA2007: Warten Sie nicht direkt auf einen Vorgang Eine asynchrone Methode erwartet eine Task direkt.
CA2008: Aufgaben nicht erstellen, ohne einen TaskScheduler- Ein Vorgangserstellungs- oder Fortsetzungsvorgang verwendet eine Methodenüberladung, die keinen TaskScheduler Parameter angibt.
CA2009: Rufen Sie ToImmutableCollection nicht für einen ImmutableCollection-Wert ToImmutable Methode wurde unnötigerweise für eine unveränderliche Auflistung aus System.Collections.Immutable Namespace aufgerufen.
CA2011: Eigenschaft nicht innerhalb des Setter- zuweisen Eine Eigenschaft wurde versehentlich einem Wert innerhalb eines eigenen set accessorzugewiesen.
CA2012: Verwenden von ValueTasks ordnungsgemäß ValueTasks, die von Memberaufrufen zurückgegeben werden, sollen direkt erwartet werden. Versuche, einen ValueTask mehrmals zu nutzen oder direkt auf das Ergebnis zuzugreifen, bevor es als erledigt bekannt ist, kann zu einer Ausnahme oder Beschädigung führen. Das Ignorieren eines solchen ValueTask ist wahrscheinlich ein Hinweis auf einen funktionalen Fehler und kann die Leistung beeinträchtigen.
CA2013: Verwenden Sie "ReferenceEquals" nicht mit Werttypen Beim Vergleichen von Werten mit System.Object.ReferenceEquals, wenn objA und objB Werttypen sind, werden sie boxt, bevor sie an die ReferenceEquals-Methode übergeben werden. Dies bedeutet, dass die ReferenceEquals Methode trotzdem "false" zurückgibt, auch wenn objA und objB dieselbe Instanz eines Werttyps darstellen.
CA2014: Verwenden Sie "Stackalloc" nicht in Schleifen. Stapelspeicher, der von einem Stackalloc zugewiesen wird, wird nur am Ende des Aufrufs der aktuellen Methode freigegeben. Die Verwendung in einer Schleife kann zu einem ungebundenen Stapelwachstum und eventuellen Stapelüberlaufbedingungen führen.
CA2015: Definieren Sie keine Finalizer für Typen, die von MemoryManager<T> Das Hinzufügen eines Finalizers zu einem von MemoryManager<T> abgeleiteten Typ kann das Freigeben des Speichers ermöglichen, während er noch von einem Span<T>verwendet wird.
CA2016: Weiterleiten des CancellationToken-Parameters an Methoden, die eine Leiten Sie den CancellationToken-Parameter an Methoden weiter, die einen Parameter verwenden, um sicherzustellen, dass die Benachrichtigungen zum Abbruch des Vorgangs ordnungsgemäß verteilt werden, oder übergeben Sie CancellationToken.None explizit, um anzugeben, dass das Token absichtlich nicht weitergegeben wird.
CA2017: Parameteranzahl stimmt nicht überein Die Anzahl der parameter, die in der Protokollierungsmeldungsvorlage angegeben sind, stimmen nicht mit der Anzahl der benannten Platzhalter überein.
CA2018: Das argument count zu Buffer.BlockCopy sollte die Anzahl der Bytes angeben, die Bei Verwendung von Buffer.BlockCopygibt das argument count die Anzahl der zu kopierenden Bytes an. Sie sollten nur Array.Length für das argument count für Arrays verwenden, deren Elemente genau ein Byte groß sind. byte, sbyteund bool Arrays weisen Elemente auf, die ein Byte groß sind.
CA2019: ThreadStatic Felder sollten keine Inlineinitialisierung Ein Feld, das mit ThreadStaticAttribute kommentiert wird, wird inline oder explizit in einem static (Shared in Visual Basic) Konstruktor initialisiert.
CA2020: Verhindern von Verhaltensänderungen durch integrierte Operatoren von IntPtr/UIntPtr Einige integrierte Operatoren, die in .NET 7 hinzugefügt wurden, verhalten sich anders als die benutzerdefinierten Operatoren in .NET 6 und früheren Versionen. Einige Operatoren, die verwendet wurden, um den deaktivierten Kontext auszuwerfen, während der Überlauf nicht mehr ausgelöst wurde, es sei denn, sie werden im aktivierten Kontext eingeschlossen. Einige Operatoren, die zuvor nicht im aktivierten Kontext ausgelöst wurden, werden jetzt ausgelöst, es sei denn, sie wurden in nicht aktivierten Kontext eingeschlossen.
CA2021: Rufen Sie Enumerable.Cast<T> oder Enumerable.OfType<T> nicht mit inkompatiblen Typen Ein Aufruf von Enumerable.Cast<TResult>(IEnumerable) oder Enumerable.OfType<TResult>(IEnumerable) gibt einen Typparameter an, der nicht mit dem Typ der Eingabeauflistung kompatibel ist.
CA2022: Vermeiden von ungenauen Lesevorgängen mit Stream.Read Ein Aufruf von Stream.Read kann weniger Bytes als angefordert zurückgeben, was zu unzuverlässigem Code führt, wenn der Rückgabewert nicht überprüft wird.
CA2024: Verwenden Sie "StreamReader.EndOfStream" nicht in asynchronen Methoden Die Eigenschaft StreamReader.EndOfStream kann zu unbeabsichtigter synchroner Blockierung führen, wenn keine Daten gepuffert werden. Verwenden Sie stattdessen StreamReader.ReadLineAsync() direkt, was null zurückgibt, wenn das Ende des Datenstroms erreicht wird.