Aracılığıyla paylaş


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 8'de 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 AttributeTargets tarafından All 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

Ayrıca bkz.