CA1018: Marcar atributos con AttributeUsageAttribute
Propiedad | Value |
---|---|
Identificador de la regla | CA1018 |
Título | Marcar atributos con AttributeUsageAttribute |
Categoría | Diseño |
La corrección es problemática o no problemática | Problemático |
Habilitado de forma predeterminada en .NET 9 | Como sugerencia |
Causa
El atributo System.AttributeUsageAttribute no está presente en el atributo personalizado.
Descripción de la regla
Cuando defina un atributo personalizado, márquelo utilizando AttributeUsageAttribute para indicar dónde se puede aplicar 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, podría definir un atributo que identifique a la persona responsable de mantener y mejorar cada tipo de una biblioteca, y esa responsabilidad siempre se asigna en el nivel de tipo. En este caso, los compiladores deberían habilitar el atributo en las clases, las enumeraciones y las interfaces, pero no deberían habilitarlo en los métodos, los eventos o las propiedades. Las directivas y los procedimientos de la organización determinarán si el atributo debe estar habilitado en los ensamblados.
La enumeración System.AttributeTargets define los destinos que se pueden especificar para un atributo personalizado. Si se omite AttributeUsageAttribute, el atributo personalizado será válido para todos los destinos, tal y como se define en el valor All
de la enumeración AttributeTargets.
Cómo corregir infracciones
Para corregir una infracción de esta regla, especifique los destinos para el atributo mediante AttributeUsageAttribute. Consulte el ejemplo siguiente.
Cuándo suprimir las advertencias
Debe corregir una infracción de esta regla en lugar de excluir el mensaje. Incluso si el atributo hereda AttributeUsageAttribute, el atributo debe estar presente para simplificar el mantenimiento del código.
Ejemplo
En el ejemplo siguiente se definen dos atributos. BadCodeMaintainerAttribute
omite de forma incorrecta la instrucción AttributeUsageAttribute, y GoodCodeMaintainerAttribute
implementa correctamente el atributo que se ha descrito anteriormente en esta sección. (La propiedad DeveloperName
es necesaria para la regla de diseño CA1019: Definir descriptores de acceso para los argumentos de atributo y se incluye por motivos de integridad).
using System;
namespace ca1018
{
// Violates rule: MarkAttributesWithAttributeUsage.
public sealed class BadCodeMaintainerAttribute : Attribute
{
public BadCodeMaintainerAttribute(string developerName)
{
DeveloperName = developerName;
}
public string DeveloperName { get; }
}
// Satisfies rule: Attributes specify AttributeUsage.
// This attribute is valid for type-level targets.
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Enum | AttributeTargets.Interface | AttributeTargets.Delegate)]
public sealed class GoodCodeMaintainerAttribute : Attribute
{
public GoodCodeMaintainerAttribute(string developerName)
{
DeveloperName = developerName;
}
public string DeveloperName { get; }
}
}
Imports System
Namespace ca1018
' Violates rule: MarkAttributesWithAttributeUsage.
Public NotInheritable Class BadCodeMaintainerAttribute
Inherits Attribute
Public Sub New(developerName As String)
Me.DeveloperName = developerName
End Sub 'New
Public ReadOnly Property DeveloperName() As String
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)>
Public NotInheritable Class GoodCodeMaintainerAttribute
Inherits Attribute
Public Sub New(developerName As String)
Me.DeveloperName = developerName
End Sub 'New
Public ReadOnly Property DeveloperName() As String
End Class
End Namespace
Reglas relacionadas
- CA1019: Definir descriptores de acceso para los argumentos de atributo
- CA1813: Evitar los atributos no sellados