Freigeben über


Leistungsregeln

Leistungsregeln unterstützen leistungsstarke Bibliotheken und Anwendungen.

In diesem Abschnitt

Regel Beschreibung
CA1802: Nach Möglichkeit Literale verwenden. Ein Feld wird als statisch und schreibgeschützt deklariert (Shared und ReadOnly in Visual Basic) und mit einem Wert initialisiert, der zur Kompilierzeit berechnet werden kann. Da der dem verwendeten Feld zugewiesene Wert zur Kompilierzeit berechnet werden kann, ändern Sie die Deklaration in ein const-Feld (Const in Visual Basic), sodass der Wert statt zur Runtime zur Kompilierzeit berechnet wird.
CA1805: Keine unnötige Initialisierung Die .NET-Runtime initialisiert alle Felder von Verweistypen mit ihren Standardwerten, bevor der Konstruktor ausgeführt wird. In den meisten Fällen ist das explizite Initialisieren eines Felds auf seinen Standardwert redundant, wodurch die Wartungskosten erhöht und die Leistung beeinträchtigt werden kann (z. B. mit erhöhter Assemblygröße).
CA1806: Methodenergebnisse nicht ignorieren. Ein neues Objekt wird erstellt, aber nie verwendet, oder eine Methode wird aufgerufen, die eine neue Zeichenfolge erstellt und zurückgibt, die nie verwendet wird, oder eine COM-Methode oder P/Invoke-Methode gibt ein HRESULT oder einen Fehlercode zurück, das oder der nie verwendet wird.
CA1810: Statische Felder von Referenztypen inline initialisieren. Wenn ein Typ einen expliziten statischen Konstruktor deklariert, überprüft der JIT-Compiler (Just in Time) jede statische Methode und jeden Instanzenkonstruktor des Typs. Dadurch wird sichergestellt, dass der statische Konstruktor zuvor aufgerufen wurde. Durch die Überprüfung statischer Konstruktoren kann die Leistung herabgesetzt werden.
CA1812: Nicht instanziierte interne Klassen vermeiden. Eine Instanz eines Typs auf Assemblyebene wird nicht durch Code in der Assembly erstellt.
CA1813: Nicht versiegelte Attribute vermeiden. .NET stellt Methoden zum Abrufen benutzerdefinierter Attribute bereit. Standardmäßig wird mit diesen Methoden die Attributvererbungshierarchie durchsucht. Durch Verwendung eines versiegelten Attributs wird das Durchsuchen der Vererbungshierarchie unterbunden und die Leistung u. U. verbessert.
CA1814: Jagged Arrays mehrdimensionalen Arrays vorziehen. Ein verzweigtes Array ist ein Array, dessen Elemente wiederum Arrays sind. Die Arrays, die die Elemente bilden, können unterschiedliche Größen haben, was bei einigen Datengruppen dazu führt, dass weniger Speicherplatz vergeudet wird.
CA1815: Equals und Gleichheitsoperator für Werttypen überschreiben. Bei Werttypen wird die Reflection-Bibliothek von der geerbten Implementierung von Equals verwendet und der Inhalt aller Felder verglichen. Reflection ist rechenintensiv, und das Überprüfen eines jeden Felds auf Gleichheit ist eventuell unnötig. Wenn Sie erwarten, dass die Benutzer Instanzen vergleichen oder sortieren bzw. dass sie die Instanzen als Schlüssel für Hashtabellen verwenden, sollte der Werttyp Equals implementieren.
CA1819: Eigenschaften sollten keine Arrays zurückgeben. Von Eigenschaften zurückgegebene Arrays sind nicht schreibgeschützt, auch wenn die Eigenschaft schreibgeschützt ist. Damit das Array gegen Manipulationen geschützt bleibt, muss die Eigenschaft eine Kopie des Arrays zurückgeben. Normalerweise verstehen die Benutzer nicht, welche negativen Auswirkungen der Aufruf einer solchen Eigenschaft auf die Leistung hat.
CA1820: Mithilfe der Zeichenfolgenlänge auf leere Zeichenfolgen prüfen. Der Vergleich von Zeichenfolgen mit der String.Length-Eigenschaft oder der String.IsNullOrEmpty-Methode führt erheblich schneller zu Ergebnissen als das Verwenden von Equals.
CA1821: Leere Finalizer entfernen. Finalizer sollten möglichst vermieden werden, da durch Verfolgung der Objektlebensdauer zusätzliche Leistung beansprucht wird. Ein leerer Finalizer verursacht zusätzlichen Aufwand ohne jeglichen Vorteil.
CA1822: Member als statisch markieren. Member, die nicht auf Instanzdaten zugreifen oder keine Instanzmethoden aufrufen, können als statisch markiert werden (Shared in Visual Basic). Danach gibt der Compiler nicht virtuelle Aufrufsites an diese Member aus. Dies kann zu einer messbaren Leistungssteigerung für leistungsabhängigen Code führen.
CA1823: Nicht verwendete private Felder vermeiden. Es wurden private Felder erkannt, auf die in der Assembly anscheinend kein Zugriff erfolgt.
CA1824: Assemblys mit NeutralResourcesLanguageAttribute markieren. Mit dem Attribut „NeutralResourcesLanguage“ wird dem Resource Manager die Sprache mitgeteilt, in der die Ressourcen einer neutralen Kultur für eine Assembly angezeigt wurden. Auf diese Weise wird die Suchleistung für die erste zu ladende Ressource verbessert und Ihr Workingset kann sich verkleinern.
CA1825: Vermeiden Sie Arrayzuteilungen mit einer Länge von 0 (null). Die Initialisierung eines Arrays der Länge 0 (null) führt zu einer unnötigen Arbeitsspeicherbelegung. Verwenden Sie stattdessen die statisch zugeordnete leere Array Instanz, indem Sie Array.Empty aufrufen. Die Arbeitsspeicherbelegung wird für alle Aufrufe dieser Methode freigegeben.
CA1826: Eigenschaft anstelle der LINQ-Enumerable-Methode verwenden. Die Enumerable LINQ-Methode wurde für einen Typ verwendet, der eine äquivalente, effizientere Eigenschaft unterstützt.
CA1827: Count/LongCount nicht verwenden, wenn Any verwendet werden kann. Die Methode Count oder LongCount wurde verwendet, obwohl die Methode Any effizienter gewesen wäre.
CA1828: CountAsync/LongCountAsync nicht verwenden, wenn AnyAsync verwendet werden kann. Die Methode CountAsync oder LongCountAsync wurde verwendet, obwohl die Methode AnyAsync effizienter gewesen wäre.
CA1829: Length/Count-Eigenschaft anstelle der Enumerable.Count-Methode verwenden. Die Count LINQ-Methode wurde für einen Typ verwendet, der eine äquivalente, effizientere Eigenschaft Length oder Count unterstützt.
CA1830: Bevorzugen Sie stark typisierte Append- und Insert-Methodenüberladungen für StringBuilder. Append und Insert stellen Überladungen für mehrere Typen bereit, die über System.String hinausgehen. Bevorzugen Sie nach Möglichkeit die stark typisierten Überladungen anstatt der Verwendung von ToString() und der auf Zeichenfolgen basierten Überladung.
CA1831: Verwenden Sie für Zeichenfolgen bei Bedarf anstelle von Range-basierten Indexern „AsSpan“. Wenn Sie einen Bereichsindexer für eine Zeichenfolge verwenden und den Wert implizit einem ReadOnlySpan<char>-Typ zuweisen, wird die Methode Substring anstelle von Slice verwendet, wodurch eine Kopie des angeforderten Teils der Zeichenfolge erzeugt wird.
CA1832: Verwenden Sie „AsSpan“ oder „AsMemory“ anstelle von Range-basierten Indexern zum Abrufen eines ReadOnlySpan- oder ReadOnlyMemory-Teils eines Arrays. Wenn Sie einen Bereichsindexer für ein Array verwenden und den Wert implizit einem Typ ReadOnlySpan<T> oder ReadOnlyMemory<T> zuweisen, wird die Methode GetSubArray anstelle von Slice verwendet, wodurch eine Kopie des angeforderten Teils des Arrays erzeugt wird.
CA1833: Verwenden Sie „AsSpan“ oder „AsMemory“ anstelle von Range-basierten Indexern zum Abrufen eines Span- oder Memory-Teils eines Arrays. Wenn Sie einen Bereichsindexer für ein Array verwenden und den Wert implizit einem Typ Span<T> oder Memory<T> zuweisen, wird die Methode GetSubArray anstelle von Slice verwendet, wodurch eine Kopie des angeforderten Teils des Arrays erzeugt wird.
CA1834: Verwenden von StringBuilder.Append(char) für Zeichenfolgen mit einem einzelnen Zeichen StringBuilder verfügt über eine Append-Überladung, die char als Argument annimmt. Bevorzugen Sie das Aufrufen der char-Überladung, um die Leistung zu verbessern
CA1835: Für „ReadAsync“ und „WriteAsync“ auf „Memory“ basierende Überladungen bevorzugen „Stream“ verfügt über eine „ReadAsync“-Überladung, die „Memory<Byte>“ als erstes Argument annimmt, und eine „WriteAsync“-Überladung, die „ReadOnlyMemory<Byte>“ als erstes Argument annimmt. Bevorzugen Sie das Aufrufen der auf Memory basierenden Überladungen, die effizienter sind.
CA1836: IsEmpty vor Count bevorzugen, wenn verfügbar Bevorzugen Sie die IsEmpty-Eigenschaft, die effizienter ist als Count, Length, Count<TSource>(IEnumerable<TSource>) oder LongCount<TSource>(IEnumerable<TSource>), um zu bestimmen, ob ein Objekt Elemente enthält.
CA1837: Environment.ProcessId anstelle von Process.GetCurrentProcess().Id verwenden Environment.ProcessId ist einfacher und schneller als Process.GetCurrentProcess().Id.
CA1838: StringBuilder-Parameter für P/Invokes vermeiden Beim Marshalling von StringBuilder wird stets eine native Pufferkopie erstellt, sodass mehrere Zuordnungen für einen Marshallingvorgang vorhanden sind.
CA1839: Verwenden von „Environment.ProcessPath“ anstelle von „Process.GetCurrentProcess().MainModule.FileName“ Environment.ProcessPath ist einfacher und schneller als Process.GetCurrentProcess().MainModule.FileName.
CA1840: Verwenden von „Environment.CurrentManagedThreadId“ anstelle von „Thread.CurrentThread.ManagedThreadId“ Environment.CurrentManagedThreadId ist kompakter und effizienter als Thread.CurrentThread.ManagedThreadId.
CA1841: Dictionary Contains-Methoden bevorzugen Das Aufrufen von Contains in der Keys- oder Values-Sammlung ist oft teurer als der Aufruf von ContainsKey oder ContainsValue im Wörterbuch selbst.
CA1842: Verwenden Sie „WhenAll“ nicht mit einer einzelnen Aufgabe Das Verwenden von WhenAll mit einer einzelnen Aufgabe kann zu Leistungseinbußen führen. Verwenden Sie stattdessen „await“, oder geben Sie die Aufgabe zurück.
CA1843: Verwenden Sie „WaitAll“ nicht mit einer einzelnen Aufgabe Das Verwenden von WaitAll mit einer einzelnen Aufgabe kann zu Leistungseinbußen führen. Verwenden Sie stattdessen „await“, oder geben Sie die Aufgabe zurück.
CA1844: Arbeitsspeicherbasierte asynchrone Methoden beim Erstellen von Unterklassen von 'Stream' außer Kraft setzen Um die Leistung zu verbessern, setzen Sie die arbeitsspeicherbasierten asynchronen Methoden beim Erstellen von Unterklassen von 'Stream' außer Kraft. Implementieren Sie dann die arraybasierten Methoden anstelle der arbeitsspeicherbasierten Methoden.
CA1845: „string.Concat“ auf Span-Basis verwenden Es ist effizienter, AsSpan und string.Concat anstelle von Substring und einem Verkettungsoperator zu verwenden.
CA1846: Bevorzugt AsSpan gegenüber Substring AsSpan ist effizienter als Substring. Substring führt eine O(n)-Zeichenfolgenkopie aus, während AsSpan das nicht tut und konstante Kosten aufweist. AsSpan führt auch keine Heapzuordnungen aus.
CA1847: Zeichenliteral für Einzelzeichensuche verwenden Verwenden Sie bei der Suche nach einem einzelnen Zeichen String.Contains(char) anstelle von String.Contains(string).
CA1848: Verwenden der LoggerMessage-Delegaten Um die Leistung zu verbessern, verwenden Sie die LoggerMessage-Delegaten.
CA1849: Asynchrone Methoden in einer asynchronen Methode aufrufen Bei einer Methode, die bereits asynchron ist, sollten Aufrufe anderer Methoden an ihre asynchronen Versionen erfolgen, sofern sie vorhanden sind.
CA1850: Statische HashData-Methode gegenüber ComputeHash bevorzugen Es ist effizienter, die statische HashData-Methode zu verwenden, statt eine HashAlgorithm-Instanz zum Aufrufen von ComputeHash zu erstellen und zu verwalten.
CA1851: Mögliche mehrere Enumerationen der „IEnumerable“-Auflistung Mögliche mehrere Enumerationen der IEnumerable-Auflistung Erwägen Sie eine Implementierung, die mehrere Enumerationen vermeidet.
CA1852: Versiegeln interner Typen Ein Typ, auf den außerhalb der Assembly nicht zugegriffen werden kann und der keine Untertypen innerhalb der enthaltenden Assembly enthält, ist nicht versiegelt.
CA1853: Nicht erforderlicher Aufruf von Dictionary.ContainsKey(key) Es ist nicht erforderlich, Dictionary.Remove(key) mit Dictionary.ContainsKey(key) zu schützen. Dictionary<TKey,TValue>.Remove(TKey) überprüft bereits, ob der Schlüssel vorhanden ist und wird nicht ausgelöst, wenn er nicht vorhanden ist.
CA1854: Bevorzugen der Methode IDictionary.TryGetValue(TKey, out TValue) Bevorzugen Sie TryGetValue gegenüber einem Zugriff auf einen Dictionary-Indexer, der durch eine ContainsKey-Überprüfung geschützt wird. ContainsKey und der Indexer schlagen beide den Schlüssel nach, sodass bei Verwendung von TryGetValue der zusätzliche Lookup vemieden wird.
CA1855: Verwenden von Span<T>.Clear() anstelle von Span<T>.Fill() Es ist effizienter, Span<T>.Clear() statt Span<T>.Fill(T) aufzurufen, um die Elemente des „span“-Elements mit einem Standardwert aufzufüllen.
CA1856: Falsche Verwendung des ConstantExpected-Attributs Das ConstantExpectedAttribute-Attribut wird nicht korrekt auf einen Parameter angewendet.
CA1857: Der Parameter erwartet eine Konstante für optimale Leistung Ein ungültiges Argument wird an einen Parameter übergeben, der mit ConstantExpectedAttribute-Anmerkungen versehen ist.
CA1858: Verwenden von StartsWith anstelle von IndexOf Es ist effizienter, String.StartsWith statt String.IndexOf aufzurufen, um zu prüfen, ob eine Zeichenfolge mit einem bestimmten Präfix beginnt.
CA1859: Verwenden Sie nach Möglichkeit konkrete Typen, um die Leistung zu verbessern Der Code verwendet Schnittstellentypen oder abstrakte Typen, die zu unnötigen Schnittstellenaufrufen oder virtuellen Aufrufen führen.
CA1860: Vermeiden der Verwendung der Erweiterungsmethode „Enumerable.Any()“ Die Verwendung von Length, Count oder IsEmpty (falls möglich) ist effizienter und übersichtlicher als der Aufruf von Enumerable.Any, um zu ermitteln, ob ein Sammlungstyp über Elemente verfügt.
CA1861: Vermeiden von konstanten Arrays als Argumente Konstantenarrays, die als Argumente übergeben werden, werden nicht wiederverwendet. Dies führt zu einem Leistungsmehraufwand. Erwägen Sie, sie in statische schreibgeschützte Felder (static readonly) zu extrahieren, um die Leistung zu verbessern.
CA1862: Verwenden der Überladungen der Methode „StringComparison“, um Vergleiche zwischen Zeichenfolgen ohne Berücksichtigung der Groß-/Kleinschreibung durchzuführen Wenn Code ToLower() oder ToUpper() aufruft, um einen Vergleich zwischen Zeichenfolgen ohne Groß-/Kleinschreibung durchzuführen, wird eine unnötige Zuordnung vorgenommen.
CA1863: Verwenden von „CompositeFormat“ Um die Formatierungskosten zu reduzieren, speichern Sie eine CompositeFormat-Instanz zwischen und verwenden sie als Argument für String.Format oder StringBuilder.AppendFormat.
CA1864: Bevorzugt die Methode „IDictionary.TryAdd(TKey, TValue)“ Sowohl Dictionary<TKey,TValue>.ContainsKey(TKey) als auch Dictionary<TKey,TValue>.Add führen ein redundantes Lookup durch. Es ist effizienter, Dictionary<TKey,TValue>.TryAdd aufzurufen, wodurch ein bool-Element zurückgegeben wird, das angibt, ob der Wert hinzugefügt wurde oder nicht. TryAdd überschreibt den Wert des Schlüssels nicht, wenn der Schlüssel bereits vorhanden ist.
CA1865-CA1867: Verwenden von Zeichenüberladung Die Zeichenüberladung ist eine Überladung mit höherer Leistung für eine Zeichenfolge mit einem einzelnen Zeichen.
CA1868: Unnötiger Aufruf von „Contains“ für Sets Sowohl ISet<T>.Add(T) wie auch ICollection<T>.Remove(T) führen ein Lookup durch, der es überflüssig macht, vorher ICollection<T>.Contains(T) aufzurufen. Es ist effizienter, Add(T) oder Remove(T) direkt aufzurufen, wodurch ein boolescher Wert zurückgegeben wird, der angibt, ob das Element hinzugefügt oder entfernt wurde.
CA1869: Zwischenspeichern und Wiederverwenden von „JsonSerializerOptions“-Instanzen Die Verwendung einer lokalen Instanz von JsonSerializerOptions für die Serialisierung oder Deserialisierung kann die Leistung Ihrer Anwendung erheblich beeinträchtigen, wenn Ihr Code mehrmals ausgeführt wird, da System.Text.Json serialisierungsbezogene Metadaten intern in der bereitgestellten Instanz zwischenspeichert.
CA1870: Verwenden einer zwischengespeicherten „SearchValues“-Instanz Die Verwendung einer zwischengespeicherten SearchValues<T>-Instanz ist effizienter als das direkte Übergeben von Werten an „IndexOfAny“ oder „ContainsAny“.
CA1871: Übergeben Sie keine nullable Struktur an 'ArgumentNullException.ThrowIfNull' 'ArgumentNullException.ThrowIfNull' akzeptiert ein 'Objekt', sodass das Übergeben einer nullablen Struktur dazu führen kann, dass der Wert boxt wird.
CA1872: 'Convert.ToHexString' und 'Convert.ToHexStringLower' zu Aufrufketten basierend auf 'BitConverter.ToString' bevorzugen Verwenden Oder Convert.ToHexString Convert.ToHexStringLower wenn Bytes in eine Hexadezimalzeichenfolgendarstellung codiert werden. Diese Methoden sind effizienter und zuordnungsfreundlicher als die Verwendung BitConverter.ToString in Kombination mit String.Replace Strichen und String.ToLowerBindestrichen.