Bagikan melalui


CA1019: Tentukan pengakses untuk argumen atribut

Properti Nilai
ID Aturan CA1019
Judul Tentukan pengakses untuk argumen atribut
Golongan Desain
Perbaikan bersifat disruptif atau non-disruptif Non-disruptif
Diaktifkan secara default di .NET 8 Tidak

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 bernama. 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 casing Pascal, dan parameter menggunakan 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

Tekan peringatan dari aturan ini jika Anda tidak ingin nilai argumen wajib dapat diambil.

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

Mengelola atribut kustom

Contoh berikut menunjukkan dua atribut yang menentukan parameter wajib (posisi). Implementasi pertama atribut salah ditentukan. 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 posisi dan bernama

Argumen posisi dan bernama memperjelas kepada konsumen 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

Baca juga