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: コレクションは、ジェネリック インターフェイスを実装しなければなりません
CA1006: ジェネリック型をメンバー シグネチャ内で入れ子にしません
CA1004: ジェネリック メソッドは型パラメーターを指定しなければなりません
CA1003: 汎用イベント ハンドラーのインスタンスを使用します