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