Olayları işleme ve tetikleme
.NET'teki olaylar temsilci modelini temel alır. Temsilci modeli, abonenin sağlayıcıya kaydolmasını ve sağlayıcıdan bildirim almasını sağlayan gözlemci tasarım desenini izler. Olay göndereni bir olayın gerçekleştiğini belirten bir bildirim gönderir ve olay alıcısı bu bildirimi alır ve buna bir yanıt tanımlar. Bu makalede temsilci modelinin ana bileşenleri, uygulamalarda olayları kullanma ve kodunuzda olayları uygulama açıklanmaktadır.
Ekinlikler
Olay, bir nesne tarafından bir eylemin oluştuğuna işaret etmek için gönderilen bir iletidir. Eyleme düğme tıklaması gibi kullanıcı etkileşimi neden olabilir veya özelliğin değerini değiştirme gibi başka bir program mantığından kaynaklanabilir. Olayı oluşturan nesne, olayı gönderen olarak adlandırılır. Olay göndereni, hangi nesnenin veya yöntemin tetiklediği olayları alacağını (işleyeceğini) bilmiyor. Olay genellikle olay göndereninin bir üyesidir; örneğin, Click olay sınıfının bir üyesidir Button ve PropertyChanged olay arabirimini uygulayan sınıfın INotifyPropertyChanged bir üyesidir.
Olay tanımlamak için, olay sınıfınızın imzasında C# event
veya Visual Basic Event
anahtar sözcüğünü kullanır ve olay için temsilci türünü belirtirsiniz. Temsilciler sonraki bölümde açıklanmıştır.
Genellikle, bir olay oluşturmak için ve virtual
(C#'da) veya Overridable
Protected
(Visual Basic içinde) olarak protected
işaretlenmiş bir yöntem eklersiniz. Bu yöntemi On
EventName olarak adlandırın; örneğin, OnDataReceived
. yöntemi, tür EventArgs veya türetilmiş bir nesne olan bir olay veri nesnesi belirten bir parametre almalıdır. Türetilmiş sınıfların olayı oluşturma mantığını geçersiz kılması için bu yöntemi sağlarsınız. Türetilmiş bir sınıf, kayıtlı temsilcilerin On
olayı aldığından emin olmak için her zaman temel sınıfın EventName yöntemini çağırmalıdır.
Aşağıdaki örnekte adlı ThresholdReached
bir olayın nasıl bildir olduğu gösterilmektedir. Olay temsilciyle EventHandler ilişkilendirilir ve adlı OnThresholdReached
bir yöntemde oluşturulur.
class Counter
{
public event EventHandler ThresholdReached;
protected virtual void OnThresholdReached(EventArgs e)
{
EventHandler handler = ThresholdReached;
handler?.Invoke(this, e);
}
// provide remaining implementation for the class
}
Public Class Counter
Public Event ThresholdReached As EventHandler
Protected Overridable Sub OnThresholdReached(e As EventArgs)
RaiseEvent ThresholdReached(Me, e)
End Sub
' provide remaining implementation for the class
End Class
Temsilciler
Temsilci, bir yönteme başvuru tutan bir türdür. Temsilci, başvurduğunu yöntemlerin dönüş türünü ve parametrelerini gösteren bir imzayla bildirilir ve yalnızca kendi imzası ile eşleşen yöntemlere başvuruları tutabilir. Bu nedenle temsilci, tür açısından güvenli işlev işaretçisine veya geri çağırmaya eşdeğerdir. Temsilci bildirimi, temsilci sınıfı tanımlamak için yeterlidir.
Temsilcilerin .NET'te birçok kullanımı vardır. Olaylar bağlamında temsilci, olay kaynağı ile olayı işleyen kod arasında bir aracıdır (veya işaretçi benzeri bir mekanizmadır). Önceki bölümdeki örnekte gösterildiği gibi, olay bildirimine temsilci türünü ekleyerek bir temsilciyi bir olayla ilişkilendirirsiniz. Temsilciler hakkında daha fazla bilgi için sınıfına Delegate bakın.
.NET, olay senaryolarının EventHandler çoğunu desteklemek için ve EventHandler<TEventArgs> temsilcilerini sağlar. Olay verilerini içermeyen tüm olaylar için temsilciyi EventHandler kullanın. EventHandler<TEventArgs> Olayla ilgili verileri içeren olaylar için temsilciyi kullanın. Bu temsilcilerin dönüş türü değeri yoktur ve iki parametre alır (olayın kaynağı için bir nesne ve olay verileri için bir nesne).
Temsilciler çok noktaya yayındır; başka bir deyişle birden fazla olay işleme yöntemine başvurular tutabilirler. Ayrıntılar için başvuru sayfasına bakın Delegate . Temsilciler, olay işlemede esneklik ve ayrıntılı denetim sağlar. Temsilci, olay için kayıtlı olay işleyicilerinin listesini tutarak olayı tetikleyen sınıf için olay dağıtıcısı görevi görür.
ve EventHandler<TEventArgs> temsilcilerinin EventHandler çalışmadığı senaryolar için bir temsilci tanımlayabilirsiniz. Temsilci tanımlamanızı gerektiren senaryolar, örneğin genel türleri tanımayan kodla çalışmanız gerektiği durumlar gibi çok nadirdir. Temsilciyi bildirimde C# delegate
ve Visual Basic Delegate
anahtar sözcüğüyle işaretlersiniz. Aşağıdaki örnekte adlı ThresholdReachedEventHandler
bir temsilcinin nasıl bildir olduğu gösterilmektedir.
public delegate void ThresholdReachedEventHandler(object sender, ThresholdReachedEventArgs e);
Public Delegate Sub ThresholdReachedEventHandler(sender As Object, e As ThresholdReachedEventArgs)
Olay verileri
Bir olayla ilişkili veriler bir olay veri sınıfı aracılığıyla sağlanabilir. .NET, uygulamalarınızda kullanabileceğiniz birçok olay veri sınıfı sağlar. Örneğin sınıfı, SerialDataReceivedEventArgs olayın olay veri sınıfıdır SerialPort.DataReceived . .NET, ile tüm olay veri sınıflarını EventArgs
sonlandırmak için bir adlandırma deseni izler. Olayın temsilcisine bakarak bir olayla ilişkili olay veri sınıfını belirlersiniz. Örneğin, SerialDataReceivedEventHandler temsilci sınıfını SerialDataReceivedEventArgs parametrelerinden biri olarak içerir.
EventArgs sınıfı, tüm olay veri sınıfları için temel türdür. EventArgs , bir olayla ilişkilendirilmiş veri olmadığında da kullandığınız sınıftır. Yalnızca diğer sınıflara bir şey olduğunu bildirmek ve herhangi bir veri geçirmesi gerekmeyen bir olay oluşturduğunuzda, sınıfını temsilciye ikinci parametre olarak ekleyin EventArgs . Veri sağlanmayan EventArgs.Empty değeri geçirebilirsiniz. Temsilci EventHandler sınıfını EventArgs parametre olarak içerir.
Özelleştirilmiş bir olay veri sınıfı oluşturmak istediğinizde, öğesinden EventArgstüretilen bir sınıf oluşturun ve ardından olayla ilgili verileri geçirmek için gereken tüm üyeleri sağlayın. Genellikle, .NET ile aynı adlandırma desenini kullanmanız ve olay veri sınıfı adınızı ile EventArgs
sonlandırmanız gerekir.
Aşağıdaki örnekte adlı ThresholdReachedEventArgs
bir olay veri sınıfı gösterilmektedir. Tetiklenen olaya özgü özellikler içerir.
public class ThresholdReachedEventArgs : EventArgs
{
public int Threshold { get; set; }
public DateTime TimeReached { get; set; }
}
Public Class ThresholdReachedEventArgs
Inherits EventArgs
Public Property Threshold As Integer
Public Property TimeReached As DateTime
End Class
Olay işleyicileri
Bir olaya yanıt vermek için olay alıcısında bir olay işleyicisi yöntemi tanımlarsınız. Bu yöntem, işlemekte olduğunuz olay için temsilcinin imzası ile eşleşmelidir. Olay işleyicisinde, olay tetiklendiğinde gerekli olan eylemleri gerçekleştirirsiniz. Örneğin, kullanıcı bir düğmeye tıkladıktan sonra kullanıcı girişini toplarsınız. Olay gerçekleştiğinde bildirim almak için olay işleyici yönteminizin olaya abone olması gerekir.
Aşağıdaki örnekte, temsilcinin imzası ile eşleşen adlı c_ThresholdReached
bir olay işleyici yöntemi gösterilmektedir EventHandler . yöntemi olaya abonedir ThresholdReached
.
class Program
{
static void Main()
{
var c = new Counter();
c.ThresholdReached += c_ThresholdReached;
// provide remaining implementation for the class
}
static void c_ThresholdReached(object sender, EventArgs e)
{
Console.WriteLine("The threshold was reached.");
}
}
Module Module1
Sub Main()
Dim c As New Counter()
AddHandler c.ThresholdReached, AddressOf c_ThresholdReached
' provide remaining implementation for the class
End Sub
Sub c_ThresholdReached(sender As Object, e As EventArgs)
Console.WriteLine("The threshold was reached.")
End Sub
End Module
Statik ve dinamik olay işleyicileri
.NET, abonelerin olay bildirimlerine statik veya dinamik olarak kaydolmasına olanak tanır. Statik olay işleyicileri, olaylarını işledikleri sınıfın tüm ömrü boyunca etkindir. Dinamik olay işleyicileri, genellikle bazı koşullu program mantığına yanıt olarak program yürütme sırasında açıkça etkinleştirilir ve devre dışı bırakılır. Örneğin, olay bildirimleri yalnızca belirli koşullar altında gerekliyse veya bir uygulama birden çok olay işleyicisi sağlıyorsa ve çalışma zamanı koşulları kullanılacak uygun olanı tanımlıyorsa kullanılabilir. Önceki bölümdeki örnekte, bir olay işleyicisinin dinamik olarak nasıl ekleneceği gösterilmektedir. Daha fazla bilgi için bkz. Olaylar (Visual Basic)ve Olaylar (C#'da).
Birden çok olay oluşturma
Sınıfınız birden çok olay oluşturursa, derleyici olay temsilcisi örneği başına bir alan oluşturur. Olay sayısı büyükse, temsilci başına bir alanın depolama maliyeti kabul edilebilir olmayabilir. Bu gibi durumlarda.NET, olay temsilcilerini depolamak için tercih ettiğiniz başka bir veri yapısıyla kullanabileceğiniz olay özellikleri sağlar.
Olay özellikleri, olay erişimcilerinin eşlik ettiği olay bildirimlerinden oluşur. Olay erişimcileri, depolama veri yapısından olay temsilcisi örnekleri eklemek veya kaldırmak için tanımladığınız yöntemlerdir. Her olay temsilcisinin çağrılabilmesi için alınması gerektiğinden olay özelliklerinin olay alanlarından daha yavaş olduğunu unutmayın. Bu denge bellek ve hız arasında. Sınıfınız seyrek tetiklenen birçok olay tanımlıyorsa, olay özelliklerini uygulamak istersiniz. Daha fazla bilgi için bkz . Nasıl yapılır: Olay Özelliklerini Kullanarak Birden Çok Olayı İşleme.
İlgili makaleler:
Başlık | Açıklama |
---|---|
Nasıl yapılır: Olaylar Oluşturma ve Kullanma | Olayları oluşturma ve kullanma örnekleri içerir. |
Nasıl yapılır: Olay Özelliklerini Kullanarak Birden Çok Olayı İşleme | Birden çok olayı işlemek için olay özelliklerinin nasıl kullanılacağını gösterir. |
Gözlemci Tasarım Deseni | Abonenin bir sağlayıcıya kaydolmasını ve sağlayıcıdan bildirim almasını sağlayan tasarım desenini açıklar. |