次の方法で共有


CA1007: 適切な場所にジェネリックを使用します

TypeName

UseGenericsWhereAppropriate

CheckId

CA1007

カテゴリ

Microsoft.Design

互換性に影響する変更点

あり

原因

外部から参照可能なメソッドに System.Object 型の参照パラメーターが含まれており、包含アセンブリが .NET Framework 2.0 を対象としています。

規則の説明

参照パラメーターは、ref (Visual Basic では ByRef) キーワードを使用して修正されるパラメーターです。 参照パラメーターに指定される引数の型は、参照パラメーターの型と厳密に一致する必要があります。 参照パラメーターの型から派生した型を使用するには、まずその型をキャストして、参照パラメーターの型の変数に割り当てる必要があります。 ジェネリック メソッドを使用することで、型を最初に参照パラメーターの型にキャストせずに、制約の影響を受けるすべての型をメソッドに渡すことができます。

違反の修正方法

この規則違反を修正するには、メソッドをジェネリック メソッドに変え、型パラメーターを使用して 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# プログラミング ガイド)