ProgramlamaVB.NET geliştiricisi

Visual Basic'de olaylar ve delege ile çalışma nasıl gerçekleştirilir ve standart ve özel olaylar için kullanım senaryoları arasındaki fark nedir?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

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:

  • Olay, yalnızca ilan edildiği sınıf içerisinde çağrılabilir;
  • Delegeler birleştirilebilir, çağrı zinciri oluşturabilir;
  • Doğru imzaya uyulmaması derleme hatalarına yol açar.

Çeldirici soru.

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.

Konunun ince noktalarını bilmemekten kaynaklanan gerçek hata örnekleri.


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.