Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Peringatan ini terjadi saat Anda menggunakan AddressOf metode dalam konteks penanganan aktivitas di mana tanda tangan metode tidak sama persis dengan tanda tangan delegasi peristiwa. Visual Basic memungkinkan konversi delegasi yang dilonggarkan dalam skenario ini, tetapi AddressOf operator menjadi redundan karena pengkompilasi tetap harus membuat delegasi pembungkus.
Memahami konversi delegasi yang dilonggarkan
Visual Basic memungkinkan Anda menetapkan metode untuk mendelegasikan bahkan ketika tanda tangan mereka tidak cocok persis, selama konversi aman. Ini disebut konversi delegasi santai dan mencakup:
- Jenis parameter yang diperlebar: Parameter metode dapat menjadi jenis yang lebih luas daripada parameter delegasi.
- Jenis pengembalian yang diperlebar: Jenis pengembalian metode dapat lebih sempit daripada jenis pengembalian delegasi.
- Parameter yang dihilangkan: Metode dapat memiliki lebih sedikit parameter daripada delegasi.
-
Nilai pengembalian yang dihilangkan: Fungsi dapat ditetapkan ke
Subdelegasi.
Ketika peringatan ini terjadi
Peringatan ini muncul ketika Visual Basic dapat menangani penugasan melalui konversi yang dilonggarkan, membuat eksplisit AddressOf tidak perlu.
Contoh lengkap memperlihatkan peringatan
Contoh berikut menunjukkan satu skenario yang menghasilkan BC42328:
Public Class DocumentProcessor
' Standard .NET event using EventHandler
Public Event DocumentProcessed As EventHandler
' Custom event with different signature
Public Event StatusChanged As Action(Of String)
' Handlers with different signatures
' Exact match for EventHandler - no warning
Private Sub OnDocumentProcessed_Exact(sender As Object, e As EventArgs)
Console.WriteLine("Document processed (exact signature)")
End Sub
' Simplified handler - causes BC42328 with EventHandler
Private Sub OnDocumentProcessed_Simple()
Console.WriteLine("Document processed (simple)")
End Sub
' Handler for custom event - exact match
Private Sub OnStatusChanged_Exact(message As String)
Console.WriteLine($"Status: {message}")
End Sub
' Handler with ignored parameters - causes BC42328 with custom event
Private Sub OnStatusChanged_Simple()
Console.WriteLine("Status changed")
End Sub
Public Sub DemonstrateWarnings()
Console.WriteLine("Setting up event handlers...")
' These work without warnings (exact matches)
AddHandler DocumentProcessed, AddressOf OnDocumentProcessed_Exact
AddHandler StatusChanged, AddressOf OnStatusChanged_Exact
' These generate BC42328 warnings (relaxed conversions)
AddHandler DocumentProcessed, AddressOf OnDocumentProcessed_Simple
AddHandler StatusChanged, AddressOf OnStatusChanged_Simple
' Fire the events
RaiseEvent DocumentProcessed(Me, EventArgs.Empty)
RaiseEvent StatusChanged("Processing complete")
End Sub
Public Sub DemonstrateSolutions()
Console.WriteLine("Using solutions to avoid warnings...")
' Solution 1: Assign to variable first
Dim handler1 As EventHandler = AddressOf OnDocumentProcessed_Simple
AddHandler DocumentProcessed, handler1
' Solution 2: Use lambda expression
AddHandler DocumentProcessed, Sub(s, e) OnDocumentProcessed_Simple()
' Solution 3: Direct assignment to delegate variable
Dim handler2 As Action(Of String) = AddressOf OnStatusChanged_Simple
AddHandler StatusChanged, handler2
' Fire the events
RaiseEvent DocumentProcessed(Me, EventArgs.Empty)
RaiseEvent StatusChanged("All solutions work")
End Sub
End Class
Saat Anda mengkompilasi kode ini, Visual Basic memperlihatkan peringatan BC42328 untuk AddHandler pernyataan yang menggunakan konversi delegasi yang dilonggarkan.
Mengapa AddressOf tampaknya "tidak berpengaruh"
Pesan peringatan menyatakan bahwa AddressOf "tidak berpengaruh" karena Visual Basic harus membuat delegasi pembungkus untuk konversi yang dilonggarkan terlepas dari itu. Operator AddressOf tidak mengubah cara pengkompilasi menangani konversi: hasil yang sama terjadi baik Anda menggunakan AddressOf atau tidak dalam skenario konversi yang dilonggarkan.
Namun, AddressOf masih diperlukan secara sintis dalam AddHandler pernyataan dan RemoveHandler .
ID Kesalahan: BC42328
Untuk memperbaiki kesalahan ini
Anda memiliki beberapa opsi tergantung pada kebutuhan Anda.
DocumentProcessor Menggunakan contoh dari sebelumnya, berikut adalah berbagai cara untuk mengatasi peringatan BC42328:
Opsi 1: Tetapkan ke variabel terlebih dahulu (mempertahankan semantik yang tepat)
Public Sub DemonstrateHandler()
' Create delegate variable first - this eliminates the warning
Dim handler As EventHandler = AddressOf OnDocumentProcessed_Simple
AddHandler DocumentProcessed, handler
End Sub
Opsi 2: Cocokkan tanda tangan delegasi dengan tepat
' Change the method signature to match EventHandler exactly
Private Sub OnDocumentProcessed_Simple(sender As Object, e As EventArgs)
' You can ignore the parameters if you don't need them
Console.WriteLine("Document processed (simple)")
End Sub
Public Sub DemonstrateHandler()
' Now this works without warning
AddHandler DocumentProcessed, AddressOf OnDocumentProcessed_Simple
End Sub
Opsi 3: Menggunakan ekspresi lambda
Public Sub DemonstrateHandler()
' Wrap the method call in a lambda that matches the signature
AddHandler DocumentProcessed, Sub(sender, e) OnDocumentProcessed_Simple()
' Or create a more complex lambda inline
AddHandler DocumentProcessed,
Sub(sender, e)
Console.WriteLine($"Event from {sender}")
OnDocumentProcessed_Simple()
End Sub
End Sub
Opsi 4: Gunakan Handles klausa (jika sesuai)
Public Class DocumentHandler
' Declare the event source with WithEvents
Private WithEvents processor As DocumentProcessor
' Use Handles clause - no AddHandler needed
Private Sub OnDocumentComplete() Handles processor.DocumentProcessed
Console.WriteLine("Document processing is done!")
End Sub
End Class
Opsi 5: Penugasan langsung ke variabel delegasi
Public Sub DemonstrateHandler()
' Assign to delegate variable then use with AddHandler
Dim handler As EventHandler = AddressOf OnDocumentProcessed_Simple
AddHandler DocumentProcessed, handler
End Sub
Ketika Anda dapat mengabaikan peringatan ini
Peringatan ini seringkali aman untuk diabaikan ketika:
- Metode handler Anda sengaja menghilangkan parameter yang tidak diperlukan.
- Anda menggunakan tanda tangan metode yang lebih sederhana untuk kode yang lebih bersih.
- Dampak performa dapat diabaikan untuk aplikasi Anda.
- Anda membuat prototipe atau menulis kode utilitas cepat di mana kejelasan lebih penting daripada efisiensi.
Konversi yang dilonggarkan berfungsi dengan benar; peringatan ini hanya menunjukkan pertimbangan efisiensi kecil. Kompiler membuat delegasi pembungkus secara otomatis, yang menambahkan beban kinerja kecil tetapi tidak memengaruhi fungsionalitas.
Contoh saat mengabaikan sudah sesuai
Public Class QuickLogger
Public Event LogMessage As Action(Of String, DateTime)
' Simple handler that ignores the timestamp parameter
Private Sub WriteToConsole()
Console.WriteLine("Something was logged")
End Sub
Public Sub SetupLogging()
' This generates BC42328, but it's fine for simple scenarios
AddHandler LogMessage, AddressOf WriteToConsole
End Sub
End Class