次の方法で共有


CA1019: 属性引数にアクセサーを定義します

TypeName

DefineAccessorsForAttributeArguments

CheckId

CA1019

[カテゴリ]

Microsoft.Design

互換性に影響する変更点

なし

原因

属性のコンストラクターで、対応するプロパティのない引数が定義されています。

規則の説明

属性では、対象に適用するときに必ず指定する必須の引数を定義できます。この引数は、コンストラクターに位置指定パラメーターで属性を指定できるようになるため、位置指定引数とも呼ばれます。必須のすべての引数について、対応する読み取り専用のプロパティも属性で規定する必要があります。これは、引数値を実行時に取得できるようにするためです。この規則では、各コンストラクターのパラメーターについて、対応するプロパティが定義されているかどうかを確認します。

また、属性ではオプションの引数も定義できます。これは名前付き引数とも呼ばれます。この引数は、名前でコンストラクターに属性を指定するときに使用されます。また、対応する読み取り/書き込みプロパティが必要です。

必須の引数でもオプションの引数でも、対応するプロパティとコンストラクターのパラメーターは、同じ名前を使用する必要があります。ただし、大文字と小文字の表記方法は異なります。プロパティでは Pascal 形式、パラメーターでは Camel 形式の表記方法が使用されます。

違反の修正方法

この規則違反を修正するには、コンストラクターのパラメーターに読み取り専用プロパティがなければ追加します。

警告を抑制する状況

必須の引数値を取得できるようにしない場合、この規則からの警告を抑制します。

カスタム属性の例

ms182136.collapse_all(ja-jp,VS.110).gifDescription

必須の (位置) パラメーターが定義された 2 つの属性を次の例に示します。属性の 1 つ目の実装は、誤って定義されています。2 つ目の実装は正しく定義されています。

ms182136.collapse_all(ja-jp,VS.110).gifコード

Imports System

Namespace DesignLibrary

' Violates rule: DefineAccessorsForAttributeArguments.
<AttributeUsage(AttributeTargets.All)>  _
NotInheritable Public Class BadCustomAttribute
    Inherits Attribute
    Private data As String

    ' Missing the property that corresponds to 
    ' the someStringData parameter.
    Public Sub New(someStringData As String)
        data = someStringData
    End Sub 'New
End Class 'BadCustomAttribute

' Satisfies rule: Attributes should have accessors for all arguments.
<AttributeUsage(AttributeTargets.All)>  _
NotInheritable Public Class GoodCustomAttribute
    Inherits Attribute
    Private data As String

    Public Sub New(someStringData As String)
        data = someStringData
    End Sub 'New

    'The constructor parameter and property
    'name are the same except for case.

    Public ReadOnly Property SomeStringData() As String
        Get
            Return data
        End Get
    End Property
End Class 

End Namespace
using System;

namespace DesignLibrary
{
// Violates rule: DefineAccessorsForAttributeArguments.

   [AttributeUsage(AttributeTargets.All)]
   public sealed class BadCustomAttribute :Attribute 
   {
      string data;

      // Missing the property that corresponds to 
      // the someStringData parameter.

      public BadCustomAttribute(string someStringData)
      {
         data = someStringData;
      }
   }

// Satisfies rule: Attributes should have accessors for all arguments.

   [AttributeUsage(AttributeTargets.All)]
   public sealed class GoodCustomAttribute :Attribute 
   {
      string data;

      public GoodCustomAttribute(string someStringData)
      {
         data = someStringData;
      }
      //The constructor parameter and property
      //name are the same except for case.

      public string SomeStringData
      {
         get 
         {
            return data;
         }
      }
   }
}

位置指定引数と名前付き引数

ms182136.collapse_all(ja-jp,VS.110).gifDescription

位置指定引数と名前付き引数は、必須または省略可能な属性の引数をライブラリのコンシューマーに示します。

次の例は、位置指定引数と名前付き引数の両方を持つ属性の実装を示しています。

ms182136.collapse_all(ja-jp,VS.110).gifコード

using System; 

namespace DesignLibrary
{    
    [AttributeUsage(AttributeTargets.All)]        
    public sealed class GoodCustomAttribute : Attribute    
    {        
        string mandatory;        
        string optional;         

        public GoodCustomAttribute(string mandatoryData)        
        {            
            mandatory = mandatoryData;        
        }         

        public string MandatoryData        
        {            
            get { return mandatory; }        
        }         

        public string OptionalData        
        {            
            get { return optional; }            
            set { optional = value; }        
        }    
    }
}

ms182136.collapse_all(ja-jp,VS.110).gifコメント

次の例は、カスタム属性を 2 つのプロパティに適用する方法を示しています。

ms182136.collapse_all(ja-jp,VS.110).gifコード

[GoodCustomAttribute("ThisIsSomeMandatoryData", OptionalData = "ThisIsSomeOptionalData")]
public string MyProperty
{
    get { return myProperty; }
    set { myProperty = value; }
}

[GoodCustomAttribute("ThisIsSomeMoreMandatoryData")]
public string MyOtherProperty
{
    get { return myOtherProperty; }
    set { myOtherProperty = value; }
}

関連規則

CA1813: シールされていない属性を使用しません

参照

関連項目

Attribute Usage Guidelines