CA1019: Tentukan pengakses untuk argumen atribut

Properti Nilai
ID Aturan CA1019
Judul Tentukan pengakses untuk argumen atribut
Kategori Desain
Perbaikan bersifat merusak atau tidak merusak Tidak terputus
Diaktifkan secara default di .NET 10 Tidak
Bahasa yang berlaku C# dan Visual Basic

Penyebab

Dalam konstruktornya, atribut menentukan argumen yang tidak memiliki properti yang sesuai.

Deskripsi aturan

Atribut dapat menentukan argumen wajib yang harus ditentukan saat Anda menerapkan atribut ke target. Hal ini juga dikenal sebagai argumen posisi karena diberikan ke konstruktor atribut sebagai parameter posisi. Untuk setiap argumen wajib, atribut juga harus menyediakan properti baca-saja yang sesuai sehingga nilai argumen dapat diambil pada waktu eksekusi. Aturan ini memeriksa bahwa untuk setiap parameter konstruktor, Anda telah menentukan properti yang sesuai.

Atribut juga dapat menentukan argumen opsional, yang juga dikenal sebagai argumen yang diberi nama. Argumen ini diberikan ke konstruktor atribut dengan nama dan harus memiliki properti baca/tulis yang sesuai.

Untuk argumen wajib dan opsional, properti dan parameter konstruktor yang sesuai harus menggunakan nama yang sama tetapi casing yang berbeda. Properti menggunakan format casing Pascal, dan parameter menggunakan format casing camel.

Cara memperbaiki pelanggaran

Untuk memperbaiki pelanggaran aturan ini, tambahkan properti baca-saja untuk setiap parameter konstruktor yang tidak memilikinya.

Kapan harus menekan peringatan

Nonaktifkan peringatan dari aturan ini jika Anda tidak ingin nilai argumen wajib dapat diakses.

Menyembunyikan peringatan

Jika Anda hanya ingin menyembunyikan satu pelanggaran, tambahkan arahan praprosedur ke file sumber Anda untuk dinonaktifkan lalu aktifkan kembali aturannya.

#pragma warning disable CA1019
// The code that's violating the rule is on this line.
#pragma warning restore CA1019

Untuk menonaktifkan aturan untuk file, folder, atau proyek, atur tingkat keparahannya ke none dalam file konfigurasi.

[*.{cs,vb}]
dotnet_diagnostic.CA1019.severity = none

Untuk informasi selengkapnya, lihat Cara menyembunyikan peringatan analisis kode.

Contoh

Atribut kustom

Contoh berikut menunjukkan dua atribut yang menentukan parameter wajib (posisi). Implementasi pertama atribut didefinisikan secara salah. Implementasi kedua sudah benar.

// 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

Argumen posisional dan argumen bernama

Argumen posisi dan bernama memperjelas bagi pengguna pustaka Anda argumen mana yang wajib untuk atribut dan argumen mana yang opsional.

Contoh berikut menunjukkan implementasi atribut yang memiliki argumen posisi dan bernama:

[AttributeUsage(AttributeTargets.All)]
public sealed class GoodCustomAttribute : Attribute
{
    public GoodCustomAttribute(string mandatoryData)
    {
        MandatoryData = mandatoryData;
    }

    public string MandatoryData { get; }

    public string? OptionalData { get; set; }
}

Contoh berikut menunjukkan cara menerapkan atribut kustom ke dua properti:

[GoodCustomAttribute("ThisIsSomeMandatoryData", OptionalData = "ThisIsSomeOptionalData")]
public string? MyProperty { get; set; }

[GoodCustomAttribute("ThisIsSomeMoreMandatoryData")]
public string? MyOtherProperty { get; set; }

CA1813: Hindari atribut yang tidak disegel

Lihat juga