Bagikan melalui


CA1018: Tandai atribut dengan AttributeUsageAttribute

Properti Nilai
ID Aturan CA1018
Judul Tandai atribut dengan AttributeUsageAttribute
Golongan Desain
Perbaikan bersifat disruptif atau non-disruptif Merusak
Diaktifkan secara default di .NET 8 Sebagai saran

Penyebab

Atribut System.AttributeUsageAttribute tidak ada pada atribut kustom.

Deskripsi aturan

Saat Anda menentukan atribut kustom, tandai dengan menggunakan AttributeUsageAttribute untuk menunjukkan di mana dalam kode sumber atribut kustom dapat diterapkan. Arti dan tujuan penggunaan atribut akan menentukan lokasi valid atribut dalam kode. Misalnya, Anda dapat menentukan atribut yang mengidentifikasi orang yang bertanggung jawab untuk memelihara dan meningkatkan setiap jenis dalam pustaka, dan tanggung jawab tersebut selalu ditetapkan pada tingkat jenis. Dalam hal ini, kompilator harus mengaktifkan atribut pada kelas, enumerasi, dan antarmuka, tetapi tidak boleh mengaktifkannya pada metode, peristiwa, atau properti. Kebijakan dan prosedur organisasi akan menentukan apakah atribut harus diaktifkan pada rakitan.

Enumerasi System.AttributeTargets menentukan target yang dapat Anda tentukan untuk atribut kustom. Jika Anda menghilangkan AttributeUsageAttribute, atribut kustom Anda akan valid untuk semua target, seperti yang ditentukan oleh All nilai AttributeTargets enumerasi.

Cara memperbaiki pelanggaran

Untuk memperbaiki pelanggaran aturan ini, tentukan target untuk atribut dengan menggunakan AttributeUsageAttribute. Lihat contoh berikut.

Kapan harus menekan peringatan

Anda harus memperbaiki pelanggaran aturan ini alih-alih mengecualikan pesan. Bahkan jika atribut mewarisi AttributeUsageAttribute, atribut harus ada untuk menyederhanakan pemeliharaan kode.

Contoh

Contoh berikut mendefinisikan dua atribut. BadCodeMaintainerAttribute salah menghilangkan AttributeUsageAttribute pernyataan, dan GoodCodeMaintainerAttribute mengimplementasikan atribut yang dijelaskan sebelumnya di bagian ini dengan benar. (Properti DeveloperName diperlukan oleh aturan desain CA1019: Tentukan aksesor untuk argumen atribut dan disertakan untuk kelengkapan.)

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

Baca juga