Поделиться через


В составе реализаций ICollection есть члены со строгим типом

Обновлен: Ноябрь 2007

TypeName

ICollectionImplementationsHaveStronglyTypedMembers

CheckId

CA1035

Категория

Microsoft.Design

Критическое изменение

Критическое

Причина

Открытый или защищенный тип реализует интерфейс System.Collections.ICollection, однако не предоставляет строго типизированный метод для ICollection.CopyTo. Строго типизированная версия метода CopyTo должна принимать два параметра и не может содержать в качестве первого параметра объект System.Array или массив объектов System.Object.

Описание правила

В соответствии с этим правилом, реализации интерфейса ICollection должны предоставлять строго типизированные члены, чтобы при использовании функций данного интерфейса пользователям не требовалось приводить аргументы к типу Object. В данном правиле предполагается, что тип реализует интерфейс ICollection для управления коллекцией экземпляров более строгого типа, чем Object.

Интерфейс ICollection реализует интерфейс System.Collections.IEnumerable. Если объекты коллекции расширяют класс System.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();
      }
   }
}

Связанные правила

Перечислители должны быть строго типизированы

Списки обладают строгой типизацией

См. также

Ссылки

System.Array

System.Collections.IEnumerable

System.Collections.ICollection

System.Object