CA1019: Definir descriptores de acceso para los argumentos de atributo
Propiedad | Value |
---|---|
Identificador de la regla | CA1019 |
Título | Definir descriptores de acceso para los argumentos de atributo |
Categoría | Diseño |
La corrección es problemática o no problemática | Poco problemático |
Habilitado de forma predeterminada en .NET 9 | No |
Causa
En su constructor, un atributo define los argumentos que no tienen propiedades correspondientes.
Descripción de la regla
Los atributos pueden definir argumentos obligatorios que deben especificarse al aplicar el atributo a un destino. Éstos también se denominan argumentos posicionales porque se proporcionan para atribuir constructores como parámetros posicionales. Para cada argumento obligatorio, el atributo debe proporcionar también una propiedad de sólo lectura correspondiente de modo que el valor del argumento se pueda recuperar en tiempo de ejecución. Esta regla comprueba que, para cada parámetro de constructor, se haya definido la propiedad correspondiente.
Los atributos también pueden definir argumentos opcionales, que también se denominan argumentos con nombre. Estos argumentos se proporcionan para atribuir constructores por nombre y deben tener una propiedad de lectura/escritura correspondiente.
En el caso de los argumentos obligatorios y opcionales, las propiedades correspondientes y los parámetros de constructor deben usar el mismo nombre, pero diferentes mayúsculas y minúsculas. Las propiedades usan mayúsculas y minúsculas Pascal, mientras que los parámetros usan mayúsculas y minúsculas Camel.
Cómo corregir infracciones
Para corregir una infracción de esta regla, agregue una propiedad de solo lectura para cada parámetro de constructor que no tenga ninguna.
Cuándo suprimir las advertencias
Suprima una advertencia de esta regla si no quiere que se pueda recuperar el valor del argumento obligatorio.
Supresión de una advertencia
Si solo quiere suprimir una única infracción, agregue directivas de preprocesador al archivo de origen para deshabilitar y volver a habilitar la regla.
#pragma warning disable CA1019
// The code that's violating the rule is on this line.
#pragma warning restore CA1019
Para deshabilitar la regla de un archivo, una carpeta o un proyecto, establezca su gravedad en none
del archivo de configuración.
[*.{cs,vb}]
dotnet_diagnostic.CA1019.severity = none
Para obtener más información, consulte Procedimiento para suprimir advertencias de análisis de código.
Ejemplos
Atributos personalizados
En el ejemplo siguiente se muestran dos atributos que definen un parámetro obligatorio (posicional). La primera implementación del atributo se ha definido incorrectamente. La segunda implementación es correcta.
// Violates rule: DefineAccessorsForAttributeArguments.
[AttributeUsage(AttributeTargets.All)]
public sealed class BadCustomAttribute : Attribute
{
string _data;
// Missing the property that corresponds to
// the someStringData constructor parameter.
public BadCustomAttribute(string someStringData)
{
_data = someStringData;
}
}
// Satisfies rule: Attributes should have accessors for all arguments.
[AttributeUsage(AttributeTargets.All)]
public sealed class GoodCustomAttribute : Attribute
{
public GoodCustomAttribute(string someStringData)
{
SomeStringData = someStringData;
}
//The constructor parameter and property
//name are the same except for case.
public string SomeStringData { get; }
}
Imports System
Namespace ca1019
' Violates rule: DefineAccessorsForAttributeArguments.
<AttributeUsage(AttributeTargets.All)>
Public NotInheritable 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)>
Public NotInheritable Class GoodCustomAttribute
Inherits Attribute
Public Sub New(someStringData As String)
Me.SomeStringData = someStringData
End Sub 'New
'The constructor parameter and property
'name are the same except for case.
Public ReadOnly Property SomeStringData() As String
End Class
End Namespace
Argumentos posicionales y con nombre
Los argumentos posicionales y con nombre aclaran a los consumidores de la biblioteca qué argumentos son obligatorios para el atributo y qué argumentos son opcionales.
En el ejemplo siguiente se muestra una implementación de un atributo que tiene argumentos posicionales y con nombre:
[AttributeUsage(AttributeTargets.All)]
public sealed class GoodCustomAttribute : Attribute
{
public GoodCustomAttribute(string mandatoryData)
{
MandatoryData = mandatoryData;
}
public string MandatoryData { get; }
public string? OptionalData { get; set; }
}
En el siguiente ejemplo se muestra cómo aplicar el atributo personalizado a dos propiedades:
[GoodCustomAttribute("ThisIsSomeMandatoryData", OptionalData = "ThisIsSomeOptionalData")]
public string? MyProperty { get; set; }
[GoodCustomAttribute("ThisIsSomeMoreMandatoryData")]
public string? MyOtherProperty { get; set; }
Reglas relacionadas
CA1813: Evitar los atributos no sellados