Freigeben über


Entwurfswarnungen

Entwurfswarnungen unterstützen die Einhaltung der .NET Framework-Entwurfsrichtlinien.

In diesem Abschnitt

Regel

Beschreibung

CA1000: Statische Member nicht in generischen Typen deklarieren

Wenn ein statischer Member eines generischen Typs aufgerufen wird, muss das Typargument für den Typ angegeben werden.Wenn ein generischer Instanzmember, der keine Unterstützung für Rückschlüsse bietet, aufgerufen wird, muss das Typargument für den Member angegeben werden.In diesen beiden Fällen ist die Syntax zum Angeben des Typarguments unterschiedlich und leicht zu verwechseln.

CA1001: Typen, die löschbare Felder besitzen, müssen gelöscht werden können

Eine Klasse deklariert und implementiert ein Instanzenfeld, das den System.IDisposable-Typ aufweist, IDisposable jedoch nicht implementiert.Eine Klasse, die ein IDisposable-Feld deklariert, besitzt indirekt eine nicht verwaltete Ressource und sollte die IDisposable-Schnittstelle implementieren.

CA1002: Generische Listen nicht verfügbar machen

System.Collections.Generic.List<(Of <(T>)>) ist eine generische Auflistung, die im Hinblick auf Leistung und nicht Vererbung entwickelt wurde.Daher enthält List keine virtuellen Member.Stattdessen sollten die generischen Auflistungen, die im Hinblick auf die Vererbung entworfen wurden, verfügbar gemacht werden.

CA1003: Generische Ereignishandlerinstanzen verwenden

Ein Typ enthält einen Delegaten, der void zurückgibt. Die zugehörige Signatur enthält zwei Parameter (der erste ist ein Objekt, der zweite ein Typ, der EventArgs zugewiesen werden kann), und die enthaltende Assembly hat .NET Framework 2.0 zum Ziel.

CA1004: Generische Methoden müssen den Typparameter angeben

Mithilfe eines Rückschlusses wird das Typargument einer generischen Methode nach dem Typ des an die Methode übergebenen Arguments festgelegt, anstatt nach der expliziten Spezifikation des Typarguments.Um den Rückschluss zu aktivieren, muss die Parametersignatur einer generischen Methode einen Parameter einschließen, der vom selben Typ wie der Typparameter für die Methode ist.In diesem Fall muss das Typargument nicht angegeben werden.Wenn für alle Typparameter der Rückschluss verwendet wird, ist die Syntax zum Aufrufen von generischen und nicht generischen Instanzenmethoden identisch. Dies vereinfacht die Verwendung generischer Methoden.

CA1005: Übermäßige Anzahl von Parametern in generischen Typen vermeiden

Je mehr Typparameter ein generischer Typ enthält, desto schwieriger ist es, zu wissen und zu behalten, was die einzelnen Typparameter darstellen.In der Regel ist dies bei einem Typparameter offensichtlich, z. B. in List<T>, und in bestimmten Fällen auch bei zwei Typparametern, z. B. in Dictionary<TKey, TValue>.Mehr als zwei Typparameter hingegen bereiten den meisten Benutzern Schwierigkeiten.

CA1006: Generische Typen in Membersignaturen nicht schachteln

Ein geschachteltes Typargument ist ein Typargument, das auch ein generischer Typ ist.Um einen Member aufzurufen, dessen Signatur ein geschachteltes Typargument enthält, muss der Benutzer einen generischen Typ instanziieren und diesen an den Konstruktor eines zweiten generischen Typs übergeben.Die erforderliche Prozedur und die Syntax sind komplex, und diese Vorgehensweise sollte daher vermieden werden.

CA1007: Nach Möglichkeit Generika verwenden

Eine extern sichtbare Methode enthält einen Verweisparameter vom Typ System.Object.Bei Verwendung einer generischen Methode können alle Typen mit gewissen Einschränkungen an die Methode übergeben werden, ohne dass der Typ zuvor in den Typ des Verweisparameters umgewandelt werden muss.

CA1008: Enumerationen müssen einen Wert von 0 (null) aufweisen

Der Standardwert einer nicht initialisierten Enumeration ist ebenso wie der anderer Werttypen 0 (null).Eine Enumeration ohne das Flags-Attribut sollte einen Member mit dem Wert 0 (null) definieren, damit der Standardwert ein gültiger Wert der Enumeration ist.Wenn eine Enumeration, auf die FlagsAttribute angewendet wird, einen Member mit dem Wert 0 (null) definiert, sollte dieser den Namen "None" haben, um anzugeben, dass in der Enumeration keine Werte festgelegt wurden.

CA1009: Ereignishandler korrekt deklarieren

Ereignishandlermethoden nehmen zwei Parameter an.Der erste ist vom Typ System.Object und hat den Namen "sender".Dies ist das Objekt, durch das das Ereignis ausgelöst wurde.Der zweite Parameter ist vom Typ System.EventArgs und hat den Namen "e".Dies sind die Daten, die dem Ereignis zugeordnet sind.Ereignishandlermethoden geben normalerweise keinen Wert zurück. In der Programmiersprache C# wird dies mit dem void-Rückgabetyp angegeben.

CA1010: Auflistungen müssen eine generische Schnittstelle implementieren

Um die Verwendbarkeit einer Auflistung zu erweitern, implementieren Sie eine der generischen Auflistungsschnittstellen.Anschließend kann die Auflistung zum Auffüllen generischer Auflistungstypen verwendet werden.

CA1011: Basistypen als Parameter übergeben

Wenn in einer Methodendeklaration ein Basistyp als Parameter angegeben wird, kann jeder Typ, der von diesem Basistyp abgeleitet ist, als entsprechendes Argument an die Methode übergeben werden.Wenn die vom abgeleiteten Parametertyp bereitgestellte zusätzliche Funktionalität nicht erforderlich ist, lässt die Verwendung des Basistyps eine allgemeinere Nutzung der Methode zu.

CA1012: Abstrakte Typen dürfen keine Konstruktoren aufweisen

Konstruktoren von abstrakten Datentypen können nur von abgeleiteten Typen aufgerufen werden.Da öffentliche Konstruktoren Instanzen eines Typs erstellen und Sie keine Instanzen eines abstrakten Datentyps erstellen können, ist ein abstrakter Datentyp mit einem öffentlichen Konstruktor fehlerhaft konzipiert.

CA1013: Gleichheitsoperator beim Überladen von Addition und Subtraktion überladen

Ein öffentlicher oder geschützter Typ implementiert den Additions- oder Subtraktionsoperator, ohne den Gleichheitsoperator zu implementieren.

CA1014: Assemblys mit CLSCompliantAttribute markieren

In der Common Language Specification (CLS) sind Benennungseinschränkungen, Datentypen und Regeln definiert, denen Assemblys entsprechen müssen, wenn sie in verschiedenen Programmiersprachen verwendet werden sollen.Um guten Entwurfsprinzipien gerecht zu werden, muss bei allen Assemblys die CLS-Kompatibilität mit CLSCompliantAttribute explizit angegeben werden.Wenn das Attribut in einer Assembly nicht vorhanden ist, ist die Assembly nicht kompatibel.

CA1016: Assemblys mit AssemblyVersionAttribute markieren

.NET Framework verwendet die Versionsnummer für die eindeutige Identifizierung einer Assembly und zum Binden an Typen in Assemblys mit starkem Namen.Die Versionsnummer wird zusammen mit der Versions- und Herausgeberrichtlinie verwendet.Standardmäßig werden Anwendungen nur mit der Assemblyversion ausgeführt, mit der sie erstellt wurden.

CA1017: Assemblys mit ComVisibleAttribute markieren

Das ComVisibleAttribute-Attribut bestimmt, wie COM-Clients auf verwalteten Code zugreifen.Gute Entwurfsprinzipien verlangen, dass die COM-Sichtbarkeit durch Assemblys explizit angegeben wird.Die COM-Sichtbarkeit kann für die gesamte Assembly festgelegt und anschließend für einzelne Typen und Typmember überschrieben werden.Wenn das Attribut fehlt, ist der Inhalt der Assembly für COM-Clients sichtbar.

CA1018: Attribute mit AttributeUsageAttribute markieren

Wenn Sie ein benutzerdefiniertes Attribut definieren, markieren Sie es mithilfe von AttributeUsageAttribute, um anzugeben, an welcher Stelle im Quellcode das benutzerdefinierte Attribut angewendet werden kann.Die Bedeutung und die beabsichtigte Verwendung eines Attributs bestimmen die gültigen Positionen des Attributs im Code.

CA1019: Accessors für Attributargumente definieren

Attribute können obligatorische Argumente definieren, die angegeben werden müssen, wenn das Attribut auf ein Ziel angewendet wird.Diese Argumente werden auch als positionelle Argumente bezeichnet, da sie bei Attributkonstruktoren als positionelle Parameter angegeben werden.Für jedes obligatorische Argument muss das Attribut außerdem eine entsprechende schreibgeschützte Eigenschaft enthalten, damit der Wert des Arguments zur Ausführungszeit abgerufen werden kann.Attribute können auch optionale Argumente definieren, die auch als benannte Argumente bezeichnet werden.Diese Argumente werden bei Attributkonstruktoren über ihren Namen angegeben und sollten über eine entsprechende Lese-Schreib-Eigenschaft verfügen.

CA1020: Namespaces mit wenigen Typen vermeiden

Stellen Sie sicher, dass jeder der Namespaces logisch organisiert ist und dass es einen zulässigen Grund dafür gibt, Typen in einen wenig gefüllten Namespace einzufügen.

CA1021: out-Parameter vermeiden

Die Übergabe von Typen als Verweis (mit out oder ref) erfordert Erfahrung im Umgang mit Zeigern, Kenntnisse der Unterschiede zwischen Wert- und Verweistypen und Erfahrung im Umgang mit Methoden mit mehreren Rückgabewerten.Außerdem ist der Unterschied zwischen dem out-Parameter und dem ref-Parametern oft unklar.

CA1023: Indexer sollten nicht mehrdimensional sein

Indexer, d. h. indizierte Eigenschaften, sollten einen einzelnen Index verwenden.Wegen mehrdimensionaler Indexer kann die Verwendbarkeit der Bibliothek deutlich abnehmen.

CA1024: Nach Möglichkeit Eigenschaften verwenden

Eine öffentliche oder geschützte Methode hat einen Namen, der mit "Get" beginnt, sie nimmt keine Parameter an und gibt einen Wert zurück, bei dem es sich nicht um ein Array handelt.Die Methode ist möglicherweise als Eigenschaft geeignet.

CA1025: Sich wiederholende Argumente durch ein Parameterarray ersetzen

Verwenden Sie ein Parameterarray statt sich wiederholender Argumente, wenn die genaue Anzahl der Argumente nicht bekannt ist und diese Argumente vom gleichen Typ sind oder als gleicher Typ übergeben werden können.

CA1026: Standardparameter sollten nicht verwendet werden

Methoden, die Standardparameter verwenden, sind nach der CLS zulässig. Die CLS lässt jedoch zu, dass die Werte, die diesen Parametern zugewiesen sind, von Compilern ignoriert werden.Damit das gewünschte Verhalten in verschiedenen Programmiersprachen erhalten bleibt, müssen Methoden, die Standardparameter verwenden, durch Methodenüberladungen ersetzt werden, von denen die Standardparameter bereitgestellt werden.

CA1027: Enumerationen mit FlagsAttribute markieren

Eine Enumeration ist ein Werttyp, der einen Satz verwandter benannter Konstanten definiert.Wenden Sie FlagsAttribute auf eine Enumeration an, wenn deren benannte Konstanten sinnvoll kombiniert werden können.

CA1028: Der Enumerationsspeicher sollte Int32 sein.

Eine Enumeration ist ein Werttyp, der einen Satz verwandter benannter Konstanten definiert.Standardmäßig wird zum Speichern des konstanten Werts der System.Int32-Datentyp verwendet.Sie können diesen zugrunde liegenden Typ zwar ändern, in den meisten Szenarien ist dies jedoch weder notwendig noch empfehlenswert.

CA1030: Nach Möglichkeit Ereignisse verwenden

Diese Regel erkennt Methoden, deren Namen normalerweise für Ereignisse verwendet würden.Wenn eine Methode auf eine klar definierte Zustandsänderung hin aufgerufen wird, sollte die Methode von einem Ereignishandler aufgerufen werden.Objekte, die die Methode aufrufen, sollten Ereignisse auslösen, statt die Methode direkt aufzurufen.

CA1031: Allgemeine Ausnahmetypen nicht auffangen

Allgemeine Ausnahmen sollten nicht abgefangen werden.Fangen Sie eine spezifischere Ausnahme ab, oder lösen Sie die allgemeine Ausnahme in der letzten Anweisung des catch-Blocks erneut aus.

CA1032: Standardausnahmekonstruktoren implementieren

Falls nicht der vollständige Satz von Konstruktoren angegeben wird, wird eine ordnungsgemäße Behandlung von Ausnahmen unter Umständen erschwert.

CA1033: Schnittstellenmethoden sollten von untergeordneten Typen aufgerufen werden können

Ein unversiegelter, extern sichtbarer Typ gibt eine explizite Methodenimplementierung einer öffentlichen Schnittstelle an und gibt keine alternative extern sichtbare Methode mit dem gleichen Namen an.

CA1034: Geschachtelte Typen sollten nicht sichtbar sein

Ein geschachtelter Typ ist ein Typ, der innerhalb des Gültigkeitsbereichs eines anderen Typs deklariert ist.Geschachtelte Typen eignen sich für die Kapselung privater Implementierungsdetails der enthaltenden Typen.Bei dieser Verwendungsart sollten geschachtelte Typen nicht extern sichtbar sein.

CA1035: ICollection-Implementierungen weisen Member mit starker Typisierung auf

Nach dieser Regel müssen ICollection-Implementierungen stark typisierte Member angeben, damit die Benutzer keine Argumente in den Object-Typ umwandeln müssen, wenn sie die durch die Schnittstelle zur Verfügung gestellten Funktionen verwenden.Diese Regel geht davon aus, dass der Typ, der ICollection implementiert, diese Implementierung zur Verwaltung einer Auflistung von Instanzen eines Typs vornimmt, der stärker ist als Object.

CA1036: Methoden bei vergleichbaren Typen überschreiben

Ein öffentlicher oder geschützter Typ implementiert die System.IComparable-Schnittstelle.Er überschreibt Object.Equals nicht und überlädt auch nicht den sprachspezifischen Operator für gleich, ungleich, kleiner als und größer als.

CA1038: Enumeratoren sollten eine starke Typisierung aufweisen

Nach dieser Regel müssen IEnumerator-Implementierungen für die Current-Eigenschaft auch eine Version mit starker Typisierung angeben, damit die Benutzer den Rückgabewert nicht in den starken Typ umwandeln müssen, wenn sie die durch die Schnittstelle zur Verfügung gestellten Funktionen verwenden.

CA1039: Listen weisen eine starke Typisierung auf

Nach dieser Regel müssen IList-Implementierungen stark typisierte Member angeben, damit die Benutzer keine Argumente in den System.Object-Typ umwandeln müssen, wenn sie die durch die Schnittstelle zur Verfügung gestellten Funktionen verwenden.

CA1040: Leere Schnittstellen vermeiden

Schnittstellen definieren Member, die ein Verhalten oder einen Verwendungsvertrag bereitstellen.Die durch die Schnittstelle beschriebene Funktionalität kann von jedem Typ übernommen werden, unabhängig davon, an welcher Stelle der Typ in der Vererbungshierarchie steht.Ein Typ implementiert eine Schnittstelle, indem er Implementierungen für die Member der Schnittstelle bereitstellt.Eine leere Schnittstelle definiert keine Member. Daher definiert sie keinen Vertrag, der implementiert werden kann.

CA1041: ObsoleteAttribute-Meldung bereitstellen

Ein Typ oder Member wird mit einem System.ObsoleteAttribute-Attribut markiert, dessen ObsoleteAttribute.Message-Eigenschaft nicht angegeben wurde.Wenn ein mit ObsoleteAttribute markierter Typ oder Member kompiliert wird, wird die Message-Eigenschaft des Attributs angezeigt, die den Benutzer über den veralteten Typ oder Member informiert.

CA1043: Ganzzahliges Argument oder Zeichenfolgenargument für Indexer verwenden

Indexer (d. h. indizierte Eigenschaften) sollten ganzzahlige Typen oder Zeichenfolgentypen für den Index verwenden.Diese Typen werden i. d. R. zum Indizieren von Datenstrukturen verwendet und erweitern den Einsatzbereich der Bibliothek.Die Verwendung des Object-Typs sollte auf die Fälle beschränkt werden, in denen der spezielle integrale oder Zeichenfolgentyp zur Entwurfszeit nicht angegeben werden kann.

CA1044: Eigenschaften sollten nicht lesegeschützt sein

Obwohl eine schreibgeschützte Eigenschaft akzeptabel und oft erforderlich ist, verhindern die Entwurfsrichtlinien die Verwendung von Eigenschaften, die nur geschrieben werden können.Wenn ein Benutzer einen Wert festlegen kann, bietet es keinerlei Sicherheitsvorteile, das Lesen und Anzeigen des Werts durch den Benutzer zu sperren.Außerdem kann der Zustand freigegebener Objekte ohne Lesezugriff nicht angezeigt werden, wodurch ihre Nützlichkeit eingeschränkt wird.

CA1045: Typen nicht als Verweis übergeben

Die Übergabe von Typen als Verweis (mit out oder ref) erfordert Erfahrung im Umgang mit Zeigern, Kenntnisse der Unterschiede zwischen Wert- und Verweistypen und Erfahrung im Umgang mit Methoden mit mehreren Rückgabewerten.Entwickler von Bibliotheken für eine breite Zielgruppe sollten nicht davon ausgehen, dass die Benutzer den out-Parameter oder den ref-Parameter richtig verwenden können.

CA1046: Gleichheitsoperator für Referenztypen nicht überladen

Für Verweistypen ist die Standardimplementierung des Gleichheitsoperators fast immer zutreffend.Standardmäßig sind zwei Verweise nur dann gleich, wenn sie auf dasselbe Objekt zeigen.

CA1047: Geschützte Member in versiegelten Typen nicht deklarieren

Typen deklarieren geschützte Member, damit erbende Typen auf den Member zugreifen oder diesen überschreiben können.Per Definition kann von versiegelten Typen nicht geerbt werden. Dies bedeutet, dass geschützte Methoden für versiegelte Typen nicht aufgerufen werden können.

CA1048: Virtuelle Member in versiegelten Typen nicht deklarieren

Typen deklarieren Methoden als virtuell, damit erbende Typen die Implementierung der virtuellen Methode überschreiben können.Per Definition kann ein versiegelter Typ nicht geerbt werden.Dadurch wird eine virtuelle Methode für einen versiegelten Typ bedeutungslos.

CA1049: Typen, die systemeigene Ressourcen besitzen, müssen gelöscht werden können

Typen, die nicht verwaltete Ressourcen zuordnen, müssen IDisposable implementieren, damit Aufrufer diese Ressourcen bei Bedarf freigeben und die Lebensdauer der Objekte verkürzen können, die diese Ressourcen verwenden.

CA1050: Typen in Namespaces deklarieren

Typen werden in Namespaces deklariert, um Namenskonflikte zu verhindern und um verwandte Typen in einer Objekthierarchie zu organisieren.

CA1051: Sichtbare Instanzfelder nicht deklarieren

Ein Feld sollte primär als Implementierungsdetail verwendet werden.Felder sollten privat oder intern sein und durch die Verwendung von Eigenschaften verfügbar gemacht werden.

CA1052: Statische Haltertypen sollten versiegelt sein

Ein öffentlicher oder geschützter Typ enthält nur statische Member und wird nicht mit dem Modifizierer sealed (C#) oder NotInheritable (Visual Basic) deklariert.Ein Typ, der nicht geerbt werden soll, sollte mit dem sealed-Modifizierer markiert werden, um seine Verwendung als Basistyp zu verhindern.

CA1053: Statische Haltertypen sollten keine Konstruktoren aufweisen

Ein öffentlicher oder verschachtelter öffentlicher Typ deklariert nur statische Member und verfügt über einen öffentlichen oder geschützten Standardkonstruktor.Der Konstruktor ist überflüssig, da zum Aufrufen statischer Member keine Instanz des Typs erforderlich ist.Die Zeichenfolgenüberladung sollte die URI-Überladung aus Sicherheitsgründen mit dem Zeichenfolgenargument aufrufen.

CA1054: URI-Parameter dürfen keine Zeichenfolgen sein

Wenn eine Methode eine Zeichenfolgendarstellung eines URIs annimmt, sollte eine entsprechende Überladung angegeben werden, die eine Instanz der URI-Klasse annimmt, die diese Dienste auf sichere Weise bereitstellt.

CA1055: URI-Rückgabewerte dürfen keine Zeichenfolgen sein.

Diese Regel geht davon aus, dass die Methode einen URI zurückgibt.Eine Zeichenfolgendarstellung eines URIs ist anfällig für Analyse- und Codierungsfehler und kann zu Sicherheitsmängeln führen.Die System.Uri-Klasse stellt diese Dienste auf sichere Weise bereit.

CA1056: URI-Eigenschaften dürfen keine Zeichenfolgen sein

Diese Regel geht davon aus, dass die Eigenschaft einen URI darstellt.Eine Zeichenfolgendarstellung eines URIs ist anfällig für Analyse- und Codierungsfehler und kann zu Sicherheitsmängeln führen.Die System.Uri-Klasse stellt diese Dienste auf sichere Weise bereit.

CA1057: URI-Überladungen vom Typ string rufen Überladungen vom Typ System.Uri auf

Ein Typ deklariert Methodenüberladungen, die sich nur durch die Ersetzung eines Zeichenfolgenparameters mit einem System.Uri-Parameter unterscheiden.Die Überladung, die den Zeichenfolgenparameter akzeptiert, ruft nicht die Überladung auf, die den URI-Parameter akzeptiert.

CA1058: Typen sollten bestimmte Basistypen nicht erweitern

Ein extern sichtbarer Typ erweitert bestimmte Basistypen.Verwenden Sie eine der Alternativen.

CA1059: Member sollten bestimmte konkrete Typen nicht verfügbar machen

Ein konkreter Typ ist ein Typ, der eine vollständige Implementierung aufweist und deshalb instanziiert werden kann.Damit der Member universell verwendet werden kann, ersetzen Sie den konkreten Typ durch die vorgeschlagene Schnittstelle.

CA1060: P/Invokes in NativeMethods-Klasse verschieben

Plattformaufrufmethoden, beispielsweise Methoden, die mit System.Runtime.InteropServices.DllImportAttribute gekennzeichnet sind, oder Methoden, die in Visual Basic mithilfe des Declare-Schlüsselworts definiert wurden, greifen auf nicht verwalteten Code zu.Diese Methoden sollten der Klasse NativeMethods, SafeNativeMethods oder UnsafeNativeMethods angehören.

CA1061: Basisklassenmethoden nicht ausblenden

Eine Methode in einem Basistyp wird durch eine Methode mit identischem Namen in einem abgeleiteten Typ verdeckt, wenn die Parametersignatur der abgeleiteten Methode sich nur hinsichtlich der Typen unterscheidet, die schwächer abgeleitet sind als die entsprechenden Typen in der Parametersignatur der Basismethode.

CA1062: Argumente von öffentlichen Methoden validieren

Alle an extern sichtbare Methoden übergebenen Verweisargumente sollten auf NULL überprüft werden.

CA1063: IDisposable korrekt implementieren

Alle IDisposable-Typen müssen das Dispose-Muster korrekt implementieren.

CA1064: Ausnahmen sollten öffentlich sein

Eine interne Ausnahme ist nur innerhalb ihres eigenen internen Bereichs sichtbar.Nachdem die Ausnahme den internen Bereich verlassen hat, kann nur die Basisausnahme zum Abfangen der Ausnahme verwendet werden.Wenn die interne Ausnahme von System.Exception, System.SystemException oder System.ApplicationException geerbt wurde, verfügt der externe Code nicht über genügend Informationen zur Behandlung der Ausnahme.

CA1065: Keine Ausnahmen an unerwarteten Speicherorten auslösen

Eine Methode, von der das Auslösen von Ausnahmen nicht erwartet wird, löst eine Ausnahme aus.

CA2210: Assemblys müssen gültige starke Namen aufweisen

Der starke Name schützt Clients vor dem versehentlichen Laden einer manipulierten Assembly.Assemblys ohne starke Namen sollten nur in ganz bestimmten Szenarien bereitgestellt werden.Wenn Sie nicht einwandfrei signierte Assemblys freigeben oder verteilen, kann die Assembly manipuliert werden, die Common Language Runtime lädt die Assembly unter Umständen nicht, oder der Benutzer muss die Überprüfung auf dem Computer deaktivieren.