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


CA1007: используйте универсальные методы, если это уместно

TypeName

UseGenericsWhereAppropriate

CheckId

CA1007

Категория

Microsoft.Design

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

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

Причина

Видимый для внешнего кода метод содержит ссылочный параметр типа System.Object, однако сборка, в которой он находится, предназначена для среды .NET Framework 2.0.

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

Ссылочный параметр — это параметр, измененный с помощью ключевого слова ref (ByRef в Visual Basic). Тип аргумента, передаваемого для ссылочного параметра, должен точно совпадать с типом ссылочного параметра. Чтобы использовать тип, производный от типа ссылочного параметра, тип необходимо сначала привести и присвоить переменной типа ссылочного параметра. Использование универсального метода позволяет передавать в метод все типы без предварительного приведения к типу ссылочного параметра при условии выполнения некоторых ограничений.

Устранение нарушений

Чтобы устранить нарушение данного правила, сделайте метод универсальным и замените параметр Object параметром типа.

Отключение предупреждений

Для этого правила отключать вывод предупреждений не следует.

Пример

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

Imports System

Namespace DesignLibrary

   Public NotInheritable Class ReferenceParameters

      Private Sub New()
      End Sub

      ' This method violates the rule.
      Public Shared Sub Swap( _  
         ByRef object1 As Object, ByRef object2 As Object)

         Dim temp As Object = object1
         object1 = object2
         object2 = temp

      End Sub

      ' This method satifies the rule.
      Public Shared Sub GenericSwap(Of T)( _ 
         ByRef reference1 As T, ByRef reference2 As T)

         Dim temp As T = reference1
         reference1 = reference2
         reference2 = temp

      End Sub

   End Class

   Class Test

      Shared Sub Main()

         Dim string1 As String = "Swap"
         Dim string2 As String = "It"

         Dim object1 As Object = DirectCast(string1, Object)
         Dim object2 As Object = DirectCast(string2, Object)
         ReferenceParameters.Swap(object1, object2)
         string1 = DirectCast(object1, String)
         string2 = DirectCast(object2, String)
         Console.WriteLine("{0} {1}", string1, string2)

         ReferenceParameters.GenericSwap(string1, string2)
         Console.WriteLine("{0} {1}", string1, string2)

      End Sub

   End Class

End Namespace
using System;

namespace DesignLibrary
{
   public sealed class ReferenceParameters
   {
      private ReferenceParameters(){}

      // This method violates the rule.
      public static void Swap(ref object object1, ref object object2)
      {
         object temp = object1;
         object1 = object2;
         object2 = temp;
      }

      // This method satifies the rule.
      public static void GenericSwap<T>(ref T reference1, ref T reference2)
      {
         T temp = reference1;
         reference1 = reference2;
         reference2 = temp;
      }
   }

   class Test
   {
      static void Main()
      {
         string string1 = "Swap";
         string string2 = "It";

         object object1 = (object)string1;
         object object2 = (object)string2;
         ReferenceParameters.Swap(ref object1, ref object2);
         string1 = (string)object1;
         string2 = (string)object2;
         Console.WriteLine("{0} {1}", string1, string2);

         ReferenceParameters.GenericSwap(ref string1, ref string2);
         Console.WriteLine("{0} {1}", string1, string2);
      }
   }
}

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

CA1005: не используйте слишком много параметров в универсальных типах

CA1010: коллекции должны реализовывать универсальный интерфейс

CA1000: не объявляйте статические элементы в универсальных типах

CA1002: не следует раскрывать универсальные списки

CA1006: не вкладывайте универсальные типы в сигнатуры членов

CA1004: универсальные методы должны предоставлять параметр типа

CA1003: используйте экземпляры обработчика универсальных событий

См. также

Ссылки

Универсальные шаблоны (Руководство по программированию на C#)