CA1018: 属性を AttributeUsageAttribute に設定します

プロパティ
ルール ID CA1018
Title 属性を AttributeUsageAttribute に設定します
[カテゴリ] デザイン
修正が中断ありか中断なしか あり
.NET 8 では既定で有効 提案として

原因

カスタム属性に System.AttributeUsageAttribute 属性がありません。

規則の説明

カスタム属性を定義する場合、AttributeUsageAttribute を使用してマークし、カスタム属性を適用できるソース コードの位置を示します。 属性の意味と用途によって、コード内の有効な位置が決まります。 たとえば、ライブラリ内の各型のメンテナンスや拡張の担当者を特定する属性を定義し、その責任は常に型レベルで割り当てられるとします。 この場合、コンパイラによって、クラス、列挙型、またはインターフェイスに対してこの属性は有効になりますが、メソッド、イベント、またはプロパティに対してはこの属性が有効になりません。 この属性をアセンブリで有効にするかどうかは、組織のポリシーや手続きによって決まります。

System.AttributeTargets 列挙型には、カスタム属性に指定できるターゲットを定義します。 AttributeUsageAttribute を省略した場合、AttributeTargets 列挙型の All 値の定義に従って、カスタム属性はすべてのターゲットに対して有効になります。

違反の修正方法

この規則違反を修正するには、AttributeUsageAttribute を使用して属性のターゲットを指定します。 次の例を参照してください。

どのようなときに警告を抑制するか

このメッセージを除外するのではなく、この規則違反を修正するようにします。 属性が AttributeUsageAttribute を継承している場合でも、コードのメンテナンスを簡素化するために属性が存在する必要があります。

次の例では、2 つの属性を定義しています。 BadCodeMaintainerAttribute の場合、AttributeUsageAttribute ステートメントを誤って省略しています。また、GoodCodeMaintainerAttribute の場合、このセクションで前述した属性を正しく実装しています (プロパティ DeveloperName は設計規則「CA1019: 属性引数にアクセサーを定義します」で必須であり、完全を期すために含まれています)。

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

関連項目