CA1003: Genel olay işleyici örnekleri kullan
Özellik | Değer |
---|---|
Kural Kimliği | CA1003 |
Başlık | Genel olay işleyicisi örnekleri kullan |
Kategori | Tasarım |
Hataya neden olan veya bozulmayan düzeltme | Yeni |
.NET 8'de varsayılan olarak etkin | Hayır |
Neden
Tür, void döndüren ve imzası iki parametre (birinci bir nesne ve ikinci EventArgs'e atanabilen bir tür) içeren bir temsilci içerir ve içeren derleme .NET'i hedefler.
Varsayılan olarak, bu kural yalnızca dışarıdan görünen türlere bakar, ancak bu yapılandırılabilir.
Kural açıklaması
.NET Framework 2.0'dan önce, özel bilgileri olay işleyicisine geçirmek için sınıfından System.EventArgs türetilmiş bir sınıf belirten yeni bir temsilci bildirilmesi gerekiyordu. .NET Framework 2.0 ve sonraki sürümlerinde genel System.EventHandler<TEventArgs> temsilci, türetilen EventArgs tüm sınıfın olay işleyicisi ile birlikte kullanılmasına izin verir.
İhlalleri düzeltme
Bu kuralın ihlalini düzeltmek için temsilciyi kaldırın ve temsilciyi System.EventHandler<TEventArgs> kullanarak kullanımını değiştirin.
Temsilci Visual Basic derleyicisi tarafından otomatik olarak oluşturulursa, temsilciyi kullanmak için olay bildiriminin söz dizimini System.EventHandler<TEventArgs> değiştirin.
Uyarıların ne zaman bastırılması gerekiyor?
Bu kuraldan uyarıyı bastırmayın.
Çözümlemek için kod yapılandırma
Bu kuralın kod tabanınızın hangi bölümlerinde çalıştırılacaklarını yapılandırmak için aşağıdaki seçeneği kullanın.
Bu seçeneği yalnızca bu kural, geçerli olduğu tüm kurallar veya bu kategorideki (Tasarım) tüm kurallar için yapılandırabilirsiniz. Daha fazla bilgi için bkz . Kod kalitesi kuralı yapılandırma seçenekleri.
Belirli API yüzeylerini ekleme
Bu kuralın üzerinde çalıştırılacak kod tabanınızın hangi bölümlerini erişilebilirliklerine göre yapılandırabilirsiniz. Örneğin, kuralın yalnızca genel olmayan API yüzeyinde çalıştırılması gerektiğini belirtmek için projenizdeki bir .editorconfig dosyasına aşağıdaki anahtar-değer çiftini ekleyin:
dotnet_code_quality.CAXXXX.api_surface = private, internal
Örnek
Aşağıdaki örnekte kuralı ihlal eden bir temsilci gösterilmektedir. Visual Basic örneğinde açıklamalar, kuralı karşılamak için örneğin nasıl değiştirileceği açıklanmaktadır. C# örneği için, değiştirilen kodu gösteren bir örnek aşağıda verilmiştir.
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();
}
}
Aşağıdaki kod parçacığı, kuralı karşılayan önceki örnekten temsilci bildirimini kaldırır. ve yöntemlerindeki ClassThatRaisesEvent
ClassThatHandlesEvent
kullanımını temsilciyi System.EventHandler<TEventArgs> kullanarak değiştirir.
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();
}
}
İlgili kurallar
- CA1005: Genel türlerde aşırı parametrelerden kaçının
- CA1010: Koleksiyonlar genel arabirim uygulamalıdır
- CA1000: Genel türlerde statik üyeleri belirtme
- CA1002: Genel listeleri gösterme