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


CA1035: в составе реализаций ICollection есть строго типизированные элементы

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();
      }
   }
}

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

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

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

См. также

Ссылки

System.Array

System.Collections.IEnumerable

System.Collections.ICollection

System.Object