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 などのインターフェイス メンバー名を使用して、厳密に型指定されたメンバーを実装します。厳密に型指定されたメンバーをパブリックと宣言し、パラメーターと戻り値は、コレクションで管理される厳密な型になるように宣言します。インターフェイスで宣言されている Object や Array などの弱い型は、厳密な型で置換されます。
違反の修正方法
この規則違反を修正するには、インターフェイス メンバーを明示的に実装します (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: 列挙子は厳密に型指定されていなければなりません