CA1018: Öznitelikleri AttributeUsageAttribute ile işaretleyin
Özellik | Değer |
---|---|
Kural Kimliği | CA1018 |
Başlık | Öznitelikleri AttributeUsageAttribute ile işaretle |
Kategori | Tasarım |
Hataya neden olan veya bozulmayan düzeltme | Yeni |
.NET 9'da varsayılan olarak etkin | Öneri olarak |
Neden
System.AttributeUsageAttribute Özniteliği özel öznitelikte yok.
Kural açıklaması
Özel bir öznitelik tanımladığınızda, özel özniteliğin kaynak kodunda nereye uygulanabileceğini belirtmek için kullanarak AttributeUsageAttribute bunu işaretleyin. Bir özniteliğin anlamı ve amaçlanan kullanımı, kodun içinde onun varolan konumunu tanımlar. Örneğin, bir kitaplıktaki her türü korumak ve geliştirmekten sorumlu olan kişiyi tanımlayan bir öznitelik tanımlayabilirsiniz ve bu sorumluluk her zaman tür düzeyinde atanır. Bu durumda, derleyiciler sınıflarda, numaralandırmalarda ve arabirimlerde özniteliğini etkinleştirmeli, ancak yöntemlerde, olaylarda veya özelliklerde etkinleştirmemelidir. Kuruluş ilkeleri ve yordamları, özniteliğin derlemelerde etkinleştirilip etkinleştirilmeyeceğini belirler.
Numaralandırma, System.AttributeTargets özel bir öznitelik için belirtebileceğiniz hedefleri tanımlar. atlarsanızAttributeUsageAttribute, özel özniteliğiniz sabit listesi değeri All
tarafından AttributeTargets tanımlandığı gibi tüm hedefler için geçerli olur.
İhlalleri düzeltme
Bu kuralın ihlalini düzeltmek için kullanarak AttributeUsageAttributeözniteliğin hedeflerini belirtin. Aşağıdaki örneğe bakın.
Uyarıların ne zaman bastırılması gerekiyor?
İletiyi dışlamak yerine bu kuralın ihlalini düzeltmeniz gerekir. özniteliği devralsa AttributeUsageAttributebile, kod bakımını basitleştirmek için özniteliğinin mevcut olması gerekir.
Örnek
Aşağıdaki örnek iki özniteliği tanımlar.
BadCodeMaintainerAttribute
deyimini AttributeUsageAttribute yanlış atlar ve GoodCodeMaintainerAttribute
bu bölümün önceki bölümlerinde açıklanan özniteliği doğru şekilde uygular. (Özellik DeveloperName
, TASARıM kuralı CA1019 tarafından gereklidir: Öznitelik bağımsız değişkenleri için erişimcileri tanımlayın ve tamlık için eklenir.)
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
İlgili kurallar
- CA1019: Öznitelik bağımsız değişkenleri için erişimcileri tanımlayın
- CA1813: Korumasız özniteliklerden kaçının