CA1018: Öznitelikleri AttributeUsageAttribute ile işaretleyin

Özellik Değer
Kural Kimliği CA1018
Başlık Öznitelikleri AttributeUsageAttribute ile işaretle
Kategori Tasarım
Düzeltme bozucu ya da bozmayan olabilir Son Dakika
.NET 10'da varsayılan olarak etkin Öneri olarak
Geçerli diller C# ve Visual Basic

Neden

System.AttributeUsageAttribute Özniteliği özel öznitelikte mevcut değil.

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ı, bir özelliğin derlemelerde etkinleştirilip etkinleştirilmeyeceğini belirler.

Numaralandırma, System.AttributeTargets özel bir öznitelik için belirtebileceğiniz hedefleri tanımlar. Eğer AttributeUsageAttribute atlarsanız, özel özniteliğiniz, All değeri ile AttributeTargets numaralandırması tarafından tanımlandığı şekilde 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. Öznitelik AttributeUsageAttribute devralınsa bile, kod bakımını basitleştirmek için yine de mevcut olmalıdır.

Ö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. (Ondalık DeveloperName, tasarım kuralı CA1019: Öznitelik bağımsız değişkenleri için erişimcilerin tanımlanması gereklidir ve tamlık için eklenmiştir.)

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

Ayrıca bkz.