CA1019: необходимо определять методы доступа для аргументов атрибутов
Свойство | Значение |
---|---|
Идентификатор правила | CA1019 |
Заголовок | Определите методы доступа для аргументов атрибута |
Категория | Проектирование |
Исправление является критическим или не критическим | Не критическое |
Включен по умолчанию в .NET 9 | No |
Причина
В своем конструкторе атрибут определяет аргументы, которые не имеют соответствующих свойств.
Описание правила
Атрибуты могут определять обязательные аргументы, которые должны быть указаны при применении атрибута к целевому объекту. Они также известны как позиционные аргументы, поскольку предоставляются для конструкторов атрибутов в качестве позиционных параметров. Для каждого обязательного аргумента атрибут должен предоставлять соответствующее свойство, доступное только для чтения, чтобы извлечь значение аргумента во время выполнения. Это правило проверяет, задано ли соответствующее свойство для каждого параметра конструктора.
Кроме того, атрибуты могут определять дополнительные параметры, известные как именованные аргументы. Эти аргументы предоставляются для конструкторов атрибутов по имени и должны иметь соответствующее свойство чтения/записи.
Для обязательных и необязательных аргументов соответствующие свойства и параметры конструктора должны использовать одно и то же имя, но разные стили регистра. В свойствах используется стиль Pascal, а в параметрах "верблюжий" стиль.
Устранение нарушений
Чтобы устранить нарушение этого правила, добавьте свойство только для чтения для каждого параметра конструктора, у которого его нет.
Когда лучше отключить предупреждения
Отключайте предупреждение из этого правила, если вам не нужно, чтобы значение обязательного аргумента могло извлекаться.
Отключение предупреждений
Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.
#pragma warning disable CA1019
// The code that's violating the rule is on this line.
#pragma warning restore CA1019
Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none
в файле конфигурации.
[*.{cs,vb}]
dotnet_diagnostic.CA1019.severity = none
Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.
Примеры
Настраиваемые атрибуты
В следующем примере показаны два атрибута, определяющие обязательный (позиционный) параметр. Первая реализация атрибута определена неправильно. Вторая реализация правильная.
// 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
Позиционные и именованные аргументы
Позиционные и именованные аргументы позволяют потребителям вашей библиотеки понять, какие аргументы являются обязательными для атрибута, а какие необязательными.
В следующем примере показана реализация атрибута, имеющего как позиционные, так и именованные аргументы.
[AttributeUsage(AttributeTargets.All)]
public sealed class GoodCustomAttribute : Attribute
{
public GoodCustomAttribute(string mandatoryData)
{
MandatoryData = mandatoryData;
}
public string MandatoryData { get; }
public string? OptionalData { get; set; }
}
В следующем примере показано, как применить настраиваемый атрибут к двум свойствам.
[GoodCustomAttribute("ThisIsSomeMandatoryData", OptionalData = "ThisIsSomeOptionalData")]
public string? MyProperty { get; set; }
[GoodCustomAttribute("ThisIsSomeMoreMandatoryData")]
public string? MyOtherProperty { get; set; }
Связанные правила
CA1813: избегайте распечатанных атрибутов