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


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

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

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

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

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

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

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

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

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

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

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

См. также

Ссылки

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