Freigeben über


Entwurfsregeln

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

In diesem Abschnitt

Regel Beschreibung
CA1000: Statische Member nicht in generischen Typen deklarieren Wenn ein statisches Element eines generischen Typs aufgerufen wird, muss das Typargument für den Typ angegeben werden. Wenn ein generisches Instanzmemmemm, das die Ableitung nicht unterstützt, aufgerufen wird, muss das Typargument für das Element angegeben werden. In diesen beiden Fällen ist die Syntax für die Angabe des Typarguments unterschiedlich und leicht verwechselt.
CA1001: Typen, die löschbare Felder besitzen, müssen gelöscht werden können. Eine Klasse deklariert und implementiert ein Instanzfeld, das ein System.IDisposable-Typ ist, und die Klasse implementiert IDisposable nicht. Eine Klasse, die ein IDisposable-Feld indirekt deklariert, besitzt eine nicht verwaltete Ressource und sollte die IDisposable-Schnittstelle implementieren.
CA1002: Generische Listen nicht freigeben System.Collections.Generic.List<(Of <(T>)>) ist eine generische Auflistung, die auf Leistung ausgelegt ist, nicht vererbung. Daher enthält Die Liste keine virtuellen Mitglieder. Die generischen Auflistungen, die für die Vererbung konzipiert sind, sollten stattdessen verfügbar gemacht werden.
CA1003: Verwenden von generischen Ereignishandlerinstanzen Ein Typ enthält einen Delegaten, der keinen Wert zurückgibt, dessen Signatur zwei Parameter enthält (das erste ist ein Objekt und der zweite ein Typ, der EventArgs zuweisbar ist), und die enthaltene Assembly zielt auf das .NET Framework 2.0.
CA1005: Vermeiden übermäßiger Parameter für generische Typen Je mehr Typparameter ein generischer Typ enthält, desto schwieriger ist es zu wissen und zu merken, was jeder Typparameter darstellt. Es ist in der Regel offensichtlich mit einem Typparameter, wie in List<T>, und in bestimmten Fällen mit zwei Typparametern, wie in Dictionary<TKey, TValue>. Wenn jedoch mehr als zwei Typparameter vorhanden sind, wird die Schwierigkeit für die meisten Benutzer zu groß.
CA1008: Enums sollten einen Nullwert haben Der Standardwert einer nicht initialisierten Aufzählung, genau wie andere Werttypen, ist 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 Aufzählung, auf die das Attribut FlagsAttribute angewendet wurde, ein Element mit Nullwert definiert, sollte der Name "None" lauten, um anzugeben, dass in der Enumeration keine Werte festgelegt wurden.
CA1010: Sammlungen sollten generische Schnittstellen implementieren Um die Benutzerfreundlichkeit einer Sammlung zu erweitern, implementieren Sie eine der generischen Sammlungsschnittstellen. Anschließend kann die Auflistung verwendet werden, um generische Sammlungstypen aufzufüllen.
CA1012: Abstrakte Typen sollten keine öffentlichen Konstruktoren haben Konstruktoren für abstrakte Typen können nur von abgeleiteten Typen aufgerufen werden. Da öffentliche Konstruktoren Instanzen eines Typs erstellen und keine Instanzen eines abstrakten Typs erstellen können, ist ein abstrakter Typ, der einen öffentlichen Konstruktor aufweist, falsch entworfen.
CA1014: Assemblys mit CLSCompliantAttribute markieren. Die Common Language Specification (CLS) definiert Benennungseinschränkungen, Datentypen und Regeln, denen Assemblys entsprechen müssen, wenn sie in programmiersprachenübergreifend verwendet werden. Ein guter Entwurf bestimmt, dass alle Assemblys explizit clS-Compliance mithilfe von CLSCompliantAttribute angeben. Wenn dieses Attribut für eine Assembly nicht vorhanden ist, ist die Assembly nicht kompatibel.
CA1016: Assemblys mit AssemblyVersionAttribute markieren. .NET verwendet die Versionsnummer, um eine Assembly eindeutig zu identifizieren und an Typen in stark benannten Assemblys zu binden. 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. ComVisibleAttribute bestimmt, wie COM-Clients auf verwalteten Code zugreifen. Ein gutes Design erfordert, dass Assemblys explizit die COM-Sichtbarkeit angeben. Die COM-Sichtbarkeit kann für die gesamte Assembly festgelegt und anschließend für einzelne Typen und Typmember überschrieben werden. Wenn dieses Attribut nicht vorhanden ist, sind die Inhalte 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, wo im Quellcode das benutzerdefinierte Attribut angewendet werden kann. Die Bedeutung und die beabsichtigte Verwendung eines Attributs bestimmen die gültigen Speicherorte im Code.
CA1019: Definieren von Accessoren für Attributargumente Attribute können obligatorische Argumente definieren, die angegeben werden müssen, wenn Sie das Attribut auf ein Ziel anwenden. Diese werden auch als Positionsargumente bezeichnet, da sie attributkonstruktoren als Positionsparameter bereitgestellt 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 den Attributkonstruktoren anhand des Namens bereitgestellt und sollten über eine entsprechende Lese-/Schreibeigenschaft verfügen.
CA1021: out-Parameter vermeiden. Das Übergeben von Typen als Referenz (mit "out" oder "ref") erfordert Erfahrung mit Zeigern, ein Verständnis dafür, wie sich Werttypen und Referenztypen unterscheiden, und den Umgang mit Methoden, die mehrere Rückgabewerte haben. Außerdem ist der Unterschied zwischen out- und ref-Parametern nicht weit verbreitet bekannt.
CA1024: Nach Möglichkeit Eigenschaften verwenden. Eine öffentliche oder geschützte Methode hat einen Namen, der mit "Get" beginnt, keine Parameter akzeptiert und einen Wert zurückgibt, der kein Array ist. Die Methode ist möglicherweise als Eigenschaft geeignet.
CA1027: Enumerationen mit FlagsAttribute markieren. Eine Aufzählung ist ein Werttyp, der einen Satz verwandter benannter Konstanten definiert. Wenden Sie FlagsAttribute auf eine Aufzählung an, wenn die benannten Konstanten sinnvoll kombiniert werden können.
CA1028: Der Enumerationsspeicher sollte Int32 sein. Eine Aufzählung ist ein Werttyp, der einen Satz verwandter benannter Konstanten definiert. Standardmäßig wird der Datentyp "System.Int32" verwendet, um den Konstantenwert zu speichern. Obwohl Sie diesen zugrunde liegenden Typ ändern können, ist er für die meisten Szenarien nicht erforderlich oder empfohlen.
CA1030: Nach Möglichkeit Ereignisse verwenden. Diese Regel erkennt Methoden mit Namen, die normalerweise für Ereignisse verwendet werden. Wenn eine Methode als Reaktion auf eine klar definierte Zustandsänderung aufgerufen wird, sollte die Methode von einem Ereignishandler aufgerufen werden. Objekte, die die Methode aufrufen, sollten Ereignisse auslösen, anstatt 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: Implementieren von Standard-Ausnahmekonstruktoren Wenn Sie den vollständigen Satz von Konstruktoren nicht bereitstellen, kann es schwierig sein, Ausnahmen ordnungsgemäß zu behandeln.
CA1033: Schnittstellenmethoden sollten von untergeordneten Typen aufgerufen werden können. Ein nicht versiegelter und nach außen sichtbarer Typ implementiert explizit eine Methode einer öffentlichen Schnittstelle und bietet keine alternative Methode mit demselben Namen, die nach außen sichtbar ist.
CA1034: Geschachtelte Typen sollten nicht sichtbar sein Ein geschachtelter Typ ist ein Typ, der im Bereich eines anderen Typs deklariert wird. Geschachtelte Typen eignen sich für die Kapselung privater Implementierungsdetails der enthaltenden Typen. Für diesen Zweck sollten geschachtelte Typen nicht extern sichtbar sein.
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.
CA1040: Vermeiden leerer Schnittstellen Schnittstellen definieren Mitglieder, die ein Verhalten oder einen Nutzungsvertrag bereitstellen. Die Funktionalität, die von der Schnittstelle beschrieben wird, kann von jedem Typ übernommen werden, unabhängig davon, wo der Typ in der Vererbungshierarchie angezeigt wird. Ein Typ implementiert eine Schnittstelle, indem Implementierungen für die Member der Schnittstelle bereitgestellt werden. Eine leere Schnittstelle definiert keine Member; Daher definiert sie keinen Vertrag, der implementiert werden kann.
CA1041: ObsoleteAttribute-Meldung bereitstellen. Ein Typ oder Element wird durch ein System.ObsoleteAttribute-Attribut markiert, das die Eigenschaft "ObsoleteAttribute.Message" nicht angegeben hat. Wenn ein Typ oder Element, der mit ObsoleteAttribute gekennzeichnet ist, kompiliert wird, wird die Message-Eigenschaft des Attributs angezeigt, die dem Benutzer Informationen zum veralteten Typ oder Element gibt.
CA1043: Verwenden eines integralen oder Zeichenfolgenarguments für Indexer Indexer (d. h. indizierte Eigenschaften) sollten integrale oder Zeichenfolgentypen für den Index verwenden. Diese Typen werden in der Regel zum Indizieren von Datenstrukturen verwendet und erhöhen die Benutzerfreundlichkeit der Bibliothek. Die Verwendung des Objekttyps sollte auf fälle beschränkt werden, in denen der spezifische 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. Dies liegt daran, dass es keine Sicherheit bietet, einem Benutzer zu erlauben, einen Wert festzulegen und dann zu verhindern, dass der Benutzer diesen Wert einsehen kann. Auch ohne Lesezugriff kann der Status freigegebener Objekte nicht angezeigt werden, was ihre Nützlichkeit begrenzt.
CA1045: Typen nicht als Verweis übergeben. Die Übergabe von Typen als Referenz (unter Verwendung von "out" oder "ref") erfordert Erfahrung mit Zeigern, das Verständnis, wie sich Werttypen und Referenztypen unterscheiden, und den Umgang mit Methoden, die mehrere Rückgabewerte haben. Bibliothekarchitekten, die für ein breites Publikum entwerfen, sollten nicht erwarten, dass Benutzer sich mit Out- oder Ref-Parametern vertraut machen können.
CA1046: Gleichheitsoperator für Referenztypen nicht überladen. Bei Referenztypen ist die Standardimplementierung des Gleichheitsoperators fast immer korrekt. Standardmäßig sind zwei Bezüge nur gleich, wenn sie auf dasselbe Objekt verweisen.
CA1047: Geschützte Member in versiegelten Typen nicht deklarieren. Typen deklarieren geschützte Mitglieder, sodass erbende Typen auf das Mitglied zugreifen oder es überschreiben können. Standardmäßig können versiegelte Typen nicht geerbt werden, was bedeutet, dass geschützte Methoden für versiegelte Typen nicht aufgerufen werden können.
CA1050: Typen in Namespaces deklarieren Typen werden in Namespaces deklariert, um Namenskonflikte zu verhindern und verwandte Typen in einer Objekthierarchie zu organisieren.
CA1051: Keine sichtbaren Instanzfelder deklarieren Die primäre Verwendung eines Feldes sollte als Implementierungsdetail erfolgen. 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 Mitglieder und wird nicht mit dem sealed- (C#) oder NotInheritable- (Visual Basic) Modifizierer deklariert. Ein Typ, der nicht geerbt werden soll, sollte mit dem versiegelten Modifizierer gekennzeichnet werden, um die Verwendung als Basistyp zu verhindern.
CA1053: Statische Haltertypen sollten keine Konstruktoren aufweisen. Ein öffentlicher oder geschachtelter öffentlicher Typ definiert nur statische Mitglieder 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 sollten keine Zeichenfolgen sein Wenn eine Methode eine Zeichenfolgendarstellung eines URI verwendet, sollte eine entsprechende Überladung bereitgestellt werden, die eine Instanz der URI-Klasse akzeptiert, die diese Dienste auf sichere und sichere Weise bereitstellt.
de-DE: CA1055: URI-Rückgabewerte sollten keine Zeichenfolgen sein Bei dieser Regel wird davon ausgegangen, dass die Methode einen URI zurückgibt. Eine Zeichenfolgendarstellung eines URI ist anfällig für Analyse- und Codierungsfehler und kann zu Sicherheitsrisiken führen. Die System.Uri-Klasse stellt diese Dienste in sicherer und geschützter Weise bereit.
CA1056: URI-Eigenschaften sollten keine Zeichenfolgen sein Diese Regel geht davon aus, dass die Eigenschaft einen URI darstellt. Eine Zeichenfolgendarstellung eines URI ist anfällig für Analyse- und Codierungsfehler und kann zu Sicherheitsrisiken führen. Die System.Uri-Klasse stellt diese Dienste auf sichere Weise bereit.
CA1058: Typen sollten bestimmte Basistypen nicht erweitern. Ein extern sichtbarer Typ erweitert bestimmte Basistypen. Verwenden Sie eine der Alternativen.
CA1060: P-Invokes in NativeMethods-Klasse verschieben Plattformaufrufmethoden, wie solche, die mit System.Runtime.InteropServices.DllImportAttribute gekennzeichnet sind, oder die mithilfe des Schlüsselworts Declare in Visual Basic definiert wurden, greifen auf nicht verwalteten Code zu. Diese Methoden sollten der Klasse NativeMethods, SafeNativeMethods oder UnsafeNativeMethods entsprechen.
CA1061: Basisklassenmethoden nicht ausblenden. Eine Methode in einem Basistyp wird durch eine identisch benannte Methode in einem abgeleiteten Typ ausgeblendet, wenn sich die Parametersignatur der abgeleiteten Methode nur von Typen unterscheidet, die schwacher abgeleitet sind als die entsprechenden Typen in der Parametersignatur der Basismethode.
CA1062: Überprüfen von Argumenten öffentlicher Methoden Alle Referenzargumente, die an extern sichtbare Methoden übergeben werden, sollten anhand von NULL überprüft werden.
CA1063: Implementieren Sie IDisposable korrekt Alle IDisposable-Typen sollten das Dispose-Muster korrekt implementieren.
CA1064: Ausnahmen sollten öffentlich sein Eine interne Ausnahme ist nur innerhalb des eigenen internen Bereichs sichtbar. Nachdem die Ausnahme außerhalb des internen Bereichs liegt, kann nur die Basis ausnahme verwendet werden, um die Ausnahme abzufangen. Wenn die interne Ausnahme von System.Exception, System.SystemExceptionoder System.ApplicationExceptiongeerbt wird, verfügt der externe Code nicht über ausreichende Informationen, um zu wissen, was mit der Ausnahme zu tun ist.
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.
CA1066: „IEquatable“ beim Außerkraftsetzen von „Equals“ implementieren Ein Werttyp setzt Equals Methode außer Kraft, implementiert jedoch keine IEquatable<T>.
CA1067: „Object.Equals(object)“ bei Implementierung von „IEquatable“ außer Kraft setzen Ein Typ implementiert IEquatable<T>, überschreibt jedoch nicht Equals Methode.
CA1068: CancellationToken-Parameter müssen zuletzt aufgeführt werden. Eine Methode verfügt über einen CancellationToken-Parameter, der nicht der letzte Parameter ist.
CA1069: Enums sollten keine doppelten Werte haben Eine Aufzählung weist mehrere Member auf, denen explizit derselbe Konstantenwert zugewiesen wird.
CA1070: Ereignisfelder nicht als virtuelle deklarieren Ein feldähnliches Ereignis wurde als virtuell deklariert.