CA1018: 属性を AttributeUsageAttribute に設定します
TypeName |
MarkAttributesWithAttributeUsage |
CheckId |
CA1018 |
[カテゴリ] |
Microsoft.Design |
互換性に影響する変更点 |
あり |
原因
System.AttributeUsageAttribute 属性が、カスタム属性にありません。
規則の説明
カスタム属性を定義する場合、AttributeUsageAttribute を使用してマークし、カスタム属性を適用できるソース コードの位置を示します。属性の意味と用途によって、コード内の有効な位置が決まります。たとえば、ライブラリに含まれる型の保守および強化を行う担当者について、識別する属性を定義し、その責任を常に型レベルに割り当てるとします。この場合、コンパイラで、クラス、列挙体、およびインターフェイスに対してこの属性を有効にし、メソッド、イベント、またはプロパティに対してはこの属性を無効にする必要があります。組織のポリシーと手順によって、アセンブリでこの属性が有効になるかどうかが決まります。
System.AttributeTargets 列挙体で、カスタム属性を指定できる対象を定義します。AttributeUsageAttribute を省略した場合、AttributeTargets 列挙体の All 値で定義されているように、カスタム属性はすべての対象で有効になります。
違反の修正方法
この規則違反を修正するには、AttributeUsageAttribute を使用して属性の対象を指定します。次の例を参照してください。
警告を抑制する状況
メッセージを除外するのではなく、この規則違反を修正してください。属性が AttributeUsageAttribute を継承する場合でも、コードの保守を簡単にするために属性を指定します。
使用例
2 つの属性の定義を次の例に示します。BadCodeMaintainerAttribute では誤って AttributeUsageAttribute ステートメントを省略していますが、GoodCodeMaintainerAttribute では前述の属性を正しく実装しています。DeveloperName プロパティは、デザイン規則「CA1019: 属性引数にアクセサーを定義します」に適合するために取り入れています。
Imports System
Namespace DesignLibrary
' Violates rule: MarkAttributesWithAttributeUsage.
NotInheritable Public Class BadCodeMaintainerAttribute
Inherits Attribute
Private developer As String
Public Sub New(developerName As String)
developer = developerName
End Sub 'New
Public ReadOnly Property DeveloperName() As String
Get
Return developer
End Get
End Property
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)> _
NotInheritable Public Class GoodCodeMaintainerAttribute
Inherits Attribute
Private developer As String
Public Sub New(developerName As String)
developer = developerName
End Sub 'New
Public ReadOnly Property DeveloperName() As String
Get
Return developer
End Get
End Property
End Class
End Namespace
using System;
namespace DesignLibrary
{
// Violates rule: MarkAttributesWithAttributeUsage.
public sealed class BadCodeMaintainerAttribute :Attribute
{
string developer;
public BadCodeMaintainerAttribute(string developerName)
{
developer = developerName;
}
public string DeveloperName
{
get
{
return developer;
}
}
}
// Satisfies rule: Attributes specify AttributeUsage.
// The attribute is valid for type-level targets.
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Enum | AttributeTargets.Interface | AttributeTargets.Delegate)]
public sealed class GoodCodeMaintainerAttribute :Attribute
{
string developer;
public GoodCodeMaintainerAttribute(string developerName)
{
developer = developerName;
}
public string DeveloperName
{
get
{
return developer;
}
}
}
}