CA1003: 汎用イベント ハンドラーのインスタンスを使用します
プロパティ | 値 |
---|---|
ルール ID | CA1003 |
Title | 汎用イベント ハンドラーのインスタンスを使用します |
[カテゴリ] | デザイン |
修正が中断ありか中断なしか | あり |
.NET 9 では既定で有効 | いいえ |
原因
型に void を返すデリゲートが含まれており、デリゲートのシグネチャに 2 つのパラメーター (1 つはオブジェクト、もう 1 つは EventArgs に割り当て可能な型) が含まれ、包含アセンブリのターゲットは .NET です。
既定では、この規則の対象は外部から参照できる型のみですが、これは構成可能です。
規則の説明
.NET Framework 2.0 より前のバージョンで、カスタム情報をイベント ハンドラーに渡すには、System.EventArgs クラスから派生したクラスを指定する新しいデリゲートを宣言する必要がありました。 .NET Framework 2.0 以降のバージョンでは、汎用の System.EventHandler<TEventArgs> のデリゲートにより、EventArgs から派生した任意のクラスをイベント ハンドラーと一緒に使用することができます。
違反の修正方法
この規則違反を修正するには、デリゲートを削除し、System.EventHandler<TEventArgs> デリゲートを使用してその使用を置き換えます。
Visual Basic コンパイラによってデリゲートが自動生成されている場合は、イベント宣言の構文を変更して System.EventHandler<TEventArgs> デリゲートを使用するようにします。
どのようなときに警告を抑制するか
この規則による警告は抑制しないでください。
分析するコードを構成する
次のオプションを使用して、コードベースのどの部分に対してこの規則を実行するか構成します。
このオプションを構成できる対象は、この規則だけ、それを適用するすべての規則、それを適用するこのカテゴリ (デザイン) のすべての規則のいずれかです。 詳細については、「コード品質規則の構成オプション」を参照してください。
特定の API サーフェイスを含める
ユーザー補助に基づいて、この規則を実行するコードベースの部分を構成できます。 たとえば、非パブリック API サーフェイスでのみ規則を実行するように指定するには、プロジェクトの .editorconfig ファイルに次のキーと値のペアを追加します。
dotnet_code_quality.CAXXXX.api_surface = private, internal
例
次の例は、規則に違反するデリゲートを示しています。 この Visual Basic の例では、規則を満たすように例を変更する方法をコメントで説明しています。 C# の例では、修正したコードを示す例を続けて示しています。
Imports System
Namespace ca1003
Public Class CustomEventArgs
Inherits EventArgs
Public info As String = "data"
End Class
Public Class ClassThatRaisesEvent
' This statement creates a new delegate, which violates the rule.
Event SomeEvent(sender As Object, e As CustomEventArgs)
' To satisfy the rule, comment out the previous line
' and uncomment the following line.
'Event SomeEvent As EventHandler(Of CustomEventArgs)
Protected Overridable Sub OnSomeEvent(e As CustomEventArgs)
RaiseEvent SomeEvent(Me, e)
End Sub
Sub SimulateEvent()
OnSomeEvent(New CustomEventArgs())
End Sub
End Class
Public Class ClassThatHandlesEvent
Sub New(eventRaiser As ClassThatRaisesEvent)
AddHandler eventRaiser.SomeEvent, AddressOf HandleEvent
End Sub
Private Sub HandleEvent(sender As Object, e As CustomEventArgs)
Console.WriteLine("Event handled: {0}", e.info)
End Sub
End Class
Class Test
Shared Sub Main1003()
Dim eventRaiser As New ClassThatRaisesEvent()
Dim eventHandler As New ClassThatHandlesEvent(eventRaiser)
eventRaiser.SimulateEvent()
End Sub
End Class
End Namespace
// This delegate violates the rule.
public delegate void CustomEventHandler(object sender, CustomEventArgs e);
public class CustomEventArgs : EventArgs
{
public string info = "data";
}
public class ClassThatRaisesEvent
{
public event CustomEventHandler? SomeEvent;
protected virtual void OnSomeEvent(CustomEventArgs e)
{
SomeEvent?.Invoke(this, e);
}
public void SimulateEvent()
{
OnSomeEvent(new CustomEventArgs());
}
}
public class ClassThatHandlesEvent
{
public ClassThatHandlesEvent(ClassThatRaisesEvent eventRaiser)
{
eventRaiser.SomeEvent += new CustomEventHandler(HandleEvent);
}
private void HandleEvent(object sender, CustomEventArgs e)
{
Console.WriteLine("Event handled: {0}", e.info);
}
}
class Test
{
static void MainEvent()
{
var eventRaiser = new ClassThatRaisesEvent();
var eventHandler = new ClassThatHandlesEvent(eventRaiser);
eventRaiser.SimulateEvent();
}
}
次のコード スニペットでは、前の例からデリゲートの宣言を削除し、規則を満たすようにしています。 ClassThatRaisesEvent
と ClassThatHandlesEvent
メソッドでのその使用が System.EventHandler<TEventArgs> デリゲートの使用に置き換えられています。
public class CustomEventArgs : EventArgs
{
public string info = "data";
}
public class ClassThatRaisesEvent
{
public event EventHandler<CustomEventArgs>? SomeEvent;
protected virtual void OnSomeEvent(CustomEventArgs e)
{
SomeEvent?.Invoke(this, e);
}
public void SimulateEvent()
{
OnSomeEvent(new CustomEventArgs());
}
}
public class ClassThatHandlesEvent
{
public ClassThatHandlesEvent(ClassThatRaisesEvent eventRaiser)
{
eventRaiser.SomeEvent += new EventHandler<CustomEventArgs>(HandleEvent);
}
private void HandleEvent(object? sender, CustomEventArgs e)
{
Console.WriteLine("Event handled: {0}", e.info);
}
}
class Test
{
static void MainEvent()
{
var eventRaiser = new ClassThatRaisesEvent();
var eventHandler = new ClassThatHandlesEvent(eventRaiser);
eventRaiser.SimulateEvent();
}
}
関連規則
- CA1005: ジェネリック型でパラメーターを使用しすぎないでください
- CA1010: コレクションは、ジェネリック インターフェイスを実装しなければなりません
- CA1000: ジェネリック型の静的メンバーを宣言しません
- CA1002: ジェネリック リストを公開しません
関連項目
.NET