Marcar atributos con AttributeUsageAttribute
Actualización: noviembre 2007
Nombre de tipo |
MarkAttributesWithAttributeUsage |
Identificador de comprobación |
CA1018 |
Categoría |
Microsoft.Design |
Cambio problemático |
Sí |
Motivo
El atributo System.AttributeUsageAttribute no está presente en el atributo personalizado.
Descripción de la regla
Al definir un atributo personalizado, márquelo utilizando AttributeUsageAttribute para indicar donde se puede aplicar el atributo personalizado en el código fuente. El significado de un atributo y el uso que se le va a dar determinará sus ubicaciones válidas en código. Por ejemplo, si define un atributo que identifica la persona responsable del mantenimiento y mejora de los tipos de una biblioteca, y la responsabilidad siempre se asigna al nivel de tipo, los compiladores deben permitir aplicar el atributo a las clases, enumeraciones e interfaces pero no permite aplicarlo a los métodos, eventos o propiedades. Las directivas organizativas y los procedimientos dictarían si el atributo debe permitirse en ensamblados.
La enumeración System.AttributeTargets define los destinos que puede especificar para un atributo personalizado. Si omite AttributeUsageAttribute, el atributo personalizado será válido para todos los destinos, tal como lo define All
Cómo corregir infracciones
Para corregir una infracción de esta regla, especifique los destinos para el atributo utilizando AttributeUsageAttribute. Vea el ejemplo siguiente.
Cuándo suprimir advertencias
Se debe corregir una infracción de esta regla en lugar de excluir el mensaje. Aun cuando el atributo hereda AttributeUsageAttribute, el atributo debe estar presente para simplificar el mantenimiento del código.
Ejemplo
El ejemplo siguiente define dos atributos. BadCodeMaintainerAttribute omite incorrectamente la instrucción AttributeUsageAttribute, mientras que GoodCodeMaintainerAttribute implementa correctamente el atributo descrito anteriormente. Tenga en cuenta que la regla de diseño Definir descriptores de acceso para los argumentos de atributo requiere la propiedad DeveloperName y se incluye para obtener un mejor resultado.
Imports System
Namespace DesignLibrary
' Violates rule: MarkAttributesWithAttributeUsage.
NotInheritable Public Class BadCodeMaintainerAttribute
Inherits Attribute
Private developer As String
Public Sub New(developerName As String)
developer = developerName
End Sub 'New
Public ReadOnly Property DeveloperName() As String
Get
Return developer
End Get
End Property
End Class
' Satisfies rule: Attributes specify AttributeUsage.
' The attribute is valid for type-level targets.
<AttributeUsage(AttributeTargets.Class Or AttributeTargets.Enum Or _
AttributeTargets.Interface Or AttributeTargets.Delegate)> _
NotInheritable Public Class GoodCodeMaintainerAttribute
Inherits Attribute
Private developer As String
Public Sub New(developerName As String)
developer = developerName
End Sub 'New
Public ReadOnly Property DeveloperName() As String
Get
Return developer
End Get
End Property
End Class
End Namespace
using System;
namespace DesignLibrary
{
// Violates rule: MarkAttributesWithAttributeUsage.
public sealed class BadCodeMaintainerAttribute :Attribute
{
string developer;
public BadCodeMaintainerAttribute(string developerName)
{
developer = developerName;
}
public string DeveloperName
{
get
{
return developer;
}
}
}
// Satisfies rule: Attributes specify AttributeUsage.
// The attribute is valid for type-level targets.
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Enum | AttributeTargets.Interface | AttributeTargets.Delegate)]
public sealed class GoodCodeMaintainerAttribute :Attribute
{
string developer;
public GoodCodeMaintainerAttribute(string developerName)
{
developer = developerName;
}
public string DeveloperName
{
get
{
return developer;
}
}
}
}
Reglas relacionadas
Definir descriptores de acceso para los argumentos de atributo