次の方法で共有


CA1035: ICollection の実装は、厳密に型指定されたメンバーを含んでいます

TypeName

ICollectionImplementationsHaveStronglyTypedMembers

CheckId

CA1035

分類

Microsoft.Design

互換性に影響する変更点

あり

原因

パブリック型またはプロテクト型で、ICollection を実装していますが、厳密に型指定されたメソッドが ICollection.CopyTo にありません。厳密に型指定されたバージョンの CopyTo では、2 つのパラメーターを受け入れる必要があります。また、最初のパラメーターに Array または Object の配列を指定することはできません。

規則の説明

この規則では、ICollection で厳密に型指定されたメンバーを実装する必要があります。これは、ユーザーがインターフェイスに備わっている機能を使用するときに、必ずしも引数を Object 型にキャストするとは限らないためです。この規則では、ICollection を実装する型でこの処理を行って、Object よりも厳密な型のインスタンス コレクションを管理すると想定しています。

ICollection では、IEnumerable インターフェイスを実装します。コレクション内のオブジェクトで ValueType を拡張する場合、GetEnumerator に厳密に型指定したメンバーを提示します。これによって、ボックス化によるパフォーマンスの低下を防ぐことができます。コレクションのオブジェクトが参照型である場合、この処理は必要ありません。

厳密に型指定されたバージョンのインターフェイス メンバーを実装するには、明示的に InterfaceName.InterfaceMemberName という形式の名前を使用して、インターフェイス メンバーを実装します (たとえば CopyTo)。明示的なインターフェイス メンバーでは、インターフェイスで宣言されたデータ型を使用します。CopyTo などのインターフェイス メンバー名を使用して、厳密に型指定されたメンバーを実装します。厳密に型指定されたメンバーをパブリックと宣言し、パラメーターと戻り値は、コレクションで管理される厳密な型になるように宣言します。インターフェイスで宣言されている ObjectArray などの弱い型は、厳密な型で置換されます。

違反の修正方法

この規則違反を修正するには、インターフェイス メンバーを明示的に実装します (CopyTo と宣言します)。厳密に型指定されたパブリック メンバーを追加し、CopyTo と宣言して、厳密に型指定された配列を最初のパラメーターに使用します。

警告を抑制する状況

バイナリ ツリーは、新しいコレクションを拡張する型によって厳密な型が決まります。このように新しいオブジェクト ベースのコレクションを実装するときは、この規則による警告を抑制します。このような型では、この規則を順守し、厳密に型指定されたメンバーを公開します。

使用例

ICollection の適切な実装例を次に示します。

using System;
using System.Collections;
namespace DesignLibrary
{

   public class ExceptionCollection : ICollection
   {   
      private ArrayList data;

      ExceptionCollection()
      {
         data = new ArrayList();
      }

      // Provide the explicit interface member for ICollection. 
      void ICollection.CopyTo(Array array, int index)
      {
         data.CopyTo(array, index);
      }

      // Provide the strongly typed member for ICollection. 
      public void CopyTo(Exception[] array, int index)
      {
         ((ICollection)this).CopyTo(array, index);
      }

      // Implement the rest of the ICollection members. 
      public int Count
      {
        get 
        {
           return data.Count;
        }
      }

      public object SyncRoot
      {
         get 
        {
           return this; 
        }
      }

      public bool IsSynchronized
      {
         get 
         {
            return false; 
         }
      }

      // The IEnumerable interface is implemented by ICollection. 
      // Because the type underlying this collection is a reference type, 
      // you do not need a strongly typed version of GetEnumerator. 

      public IEnumerator GetEnumerator()
      {
         return data.GetEnumerator();
      }
   }
}

関連規則

CA1038: 列挙子は厳密に型指定されていなければなりません

CA1039: リストは厳密に型指定されています

参照

関連項目

Array

IEnumerable

ICollection

Object