Visual Basic (VB.NET) delegeler, belirli bir imzaya sahip bir metoda işaret eden bir referans içeren bir türdür ve olayların işlenmesi için bir temel oluşturur. Olaylar, nesnelerin meydana gelen değişiklikler hakkında diğerlerine bildirimde bulunmasını sağlayarak delegeler üzerine inşa edilmiştir.
Standart olaylar için zaten tanımlanmış olan delegeler kullanılır, örneğin, EventHandler, özel olaylar için ise gerekli imzaya sahip kendi delege tanımınızı yapabilirsiniz:
'Özel delege ve olayın ilanı Public Delegate Sub ChangedEventHandler(sender As Object, e As EventArgs) Public Event Changed As ChangedEventHandler 'Olayın kullanımı Public Sub OnChanged() RaiseEvent Changed(Me, EventArgs.Empty) End Sub
İnce noktalar:
Neden Visual Basic'de bir olay sınıf dışından çağrılamaz, hatta Public olarak ilan edilse bile?
Cevap: Erişim belirteci Public olmasına rağmen, olay yalnızca sınıf dışından "abone olma" veya "abone olmadan çıkarma" işlemi yapılabilir, ancak sadece sınıf içinde çağrılabilir (RaiseEvent) — bu, dilin bir özelliğidir ve olayların dağıtımının kapsüllenmesini ve kontrolünü sağlar. Örneğin:
Public Class Foo Public Event MyEvent() End Class Dim f As New Foo() ' Bu yapılamaz: f.RaiseEvent MyEvent() — derleyici bunu yapmanıza izin vermez.
Hikaye
Windows Forms Projesi: Geliştirici, veriler sınıfının dışından "DataUpdated" olayını çağırmaya çalıştı, UI'yi güncellemek için. Başarısız oldu, olay işlenmedi, mimariyi yeniden düzenlemek zorunda kaldı, olayın görünürlük kapsamını yanlış anladığı için mantığı yeniden yapılandırmak zorunda kaldı.
Hikaye
Web Servisi: Delegenin tanımında bir değişken atlanmıştır. Olay abone olmuş, ancak çalışma zamanı hatasıyla çağrılmıştır — abone bir argüman beklerken, çağrı iki argümanla yapılmıştır.
Hikaye
1C için Eklenti: Geliştiriciler, RaiseEvent çağrısını taklit etmek için FieldInfo.SetValue kullandılar. Bu, arayüz durumunun uyumsuzluğuna ve derlemenin güncellenmesi sırasında çökmesine neden oldu.