CA1019: Accessors für Attributargumente definieren
TypeName |
DefineAccessorsForAttributeArguments |
CheckId |
CA1019 |
Kategorie (Category) |
Microsoft.Design |
Unterbrechende Änderung |
Nicht unterbrechend |
Ursache
Ein Attribut definiert in seinem Konstruktor Argumente, die nicht über entsprechende Eigenschaften verfügen.
Regelbeschreibung
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.Mit dieser Regel wird festgestellt, ob Sie für jeden Konstruktorparameter die entsprechende Eigenschaft definiert haben.
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.
Bei obligatorischen und optionalen Argumenten sollten für die entsprechenden Eigenschaften und Konstruktorparameter der gleiche Name, jedoch eine andere Schreibweise verwendet werden.Bei Eigenschaften wird die Pascal-Schreibweise, bei Parametern die Kamel-Schreibweise verwendet.
Behandeln von Verstößen
Um einen Verstoß gegen diese Regel zu beheben, fügen Sie eine schreibgeschützte Eigenschaft für jeden Konstruktorparameter hinzu, der nicht über eine solche Eigenschaft verfügt.
Wann sollten Warnungen unterdrückt werden?
Unterdrücken Sie eine Warnung dieser Regel, wenn der Wert des obligatorischen Arguments nicht abrufbar sein soll.
Beispiel für benutzerdefinierte Attribute
Beschreibung
Im folgenden Beispiel werden zwei Attribute veranschaulicht, die einen obligatorischen (positionellen) Parameter definieren.Die erste Implementierung des Attributs ist fehlerhaft definiert.Die zweite Implementierung ist einwandfrei.
Code
Imports System
Namespace DesignLibrary
' Violates rule: DefineAccessorsForAttributeArguments.
<AttributeUsage(AttributeTargets.All)> _
NotInheritable Public Class BadCustomAttribute
Inherits Attribute
Private data As String
' Missing the property that corresponds to
' the someStringData parameter.
Public Sub New(someStringData As String)
data = someStringData
End Sub 'New
End Class 'BadCustomAttribute
' Satisfies rule: Attributes should have accessors for all arguments.
<AttributeUsage(AttributeTargets.All)> _
NotInheritable Public Class GoodCustomAttribute
Inherits Attribute
Private data As String
Public Sub New(someStringData As String)
data = someStringData
End Sub 'New
'The constructor parameter and property
'name are the same except for case.
Public ReadOnly Property SomeStringData() As String
Get
Return data
End Get
End Property
End Class
End Namespace
using System;
namespace DesignLibrary
{
// Violates rule: DefineAccessorsForAttributeArguments.
[AttributeUsage(AttributeTargets.All)]
public sealed class BadCustomAttribute :Attribute
{
string data;
// Missing the property that corresponds to
// the someStringData parameter.
public BadCustomAttribute(string someStringData)
{
data = someStringData;
}
}
// Satisfies rule: Attributes should have accessors for all arguments.
[AttributeUsage(AttributeTargets.All)]
public sealed class GoodCustomAttribute :Attribute
{
string data;
public GoodCustomAttribute(string someStringData)
{
data = someStringData;
}
//The constructor parameter and property
//name are the same except for case.
public string SomeStringData
{
get
{
return data;
}
}
}
}
Positionsargumente und benannte Argumente
Beschreibung
Anhand von Positionsargumenten und benannten Argumenten wird Bibliotheksbenutzern verdeutlicht, welche Argumente für das Attribut zwingend und welche optional sind.
Im folgenden Beispiel wird eine Implementierung einen Attributs veranschaulicht, das sowohl über Positionsargumente als auch über benannte Argumente verfügt.
Code
using System;
namespace DesignLibrary
{
[AttributeUsage(AttributeTargets.All)]
public sealed class GoodCustomAttribute : Attribute
{
string mandatory;
string optional;
public GoodCustomAttribute(string mandatoryData)
{
mandatory = mandatoryData;
}
public string MandatoryData
{
get { return mandatory; }
}
public string OptionalData
{
get { return optional; }
set { optional = value; }
}
}
}
Kommentare
Im folgenden Beispiel wird gezeigt, wie das benutzerdefinierte Attribut auf zwei Eigenschaften angewendet wird.
Code
[GoodCustomAttribute("ThisIsSomeMandatoryData", OptionalData = "ThisIsSomeOptionalData")]
public string MyProperty
{
get { return myProperty; }
set { myProperty = value; }
}
[GoodCustomAttribute("ThisIsSomeMoreMandatoryData")]
public string MyOtherProperty
{
get { return myOtherProperty; }
set { myOtherProperty = value; }
}
Verwandte Regeln
CA1813: Nicht versiegelte Attribute vermeiden