In VB6, una subroutine di evento, come Button1_Click, era molto meno complicata perché il sistema chiamava la subroutine rigorosamente per nome. Se esisteva un evento Button1_Click, il sistema lo chiamava. È diretto e diretto.
Ma in VB.NET, ci sono due importanti aggiornamenti che rendono VB.NET SOOPercharged (che è "OOP" per la programmazione orientata agli oggetti).
Diamo un'occhiata a un semplice esempio per vedere la differenza che i parametri fanno in VB.NET.
Pulsante secondario privato1_Clicca (
Mittente ByVal come System.Object,
ByVal e As System.EventArgs
) Pulsante Maniglie1. Fare clic su
'Il tuo codice va qui
End Sub
Le subroutine di eventi ricevono sempre un oggetto "mittente" e un parametro EventArgs di sistema "e". Poiché il parametro EventArgs è un oggetto, supporta qualsiasi proprietà e metodo sia necessario. Ad esempio, la vecchia subroutine di eventi MouseBove VB6 utilizzata per ricevere quattro parametri:
Quando i mouse più avanzati sono usciti con più pulsanti, VB6 ha avuto un vero problema nel supportarli. VB.NET passa solo un parametro MouseEventArgs ma supporta molte più proprietà e metodi. E ciascuno di essi sono oggetti che supportano ancora di più. Ad esempio, la proprietà e.Button contiene tutte queste proprietà:
Se qualcuno inventa un mouse "trancendental" con un pulsante "virtuale", VB.NET dovrà solo aggiornare .NET Framework per supportarlo e, di conseguenza, nessun codice precedente si interromperà.
Esistono numerose tecnologie .NET che dipendono assolutamente da questi parametri. Ad esempio, poiché il tuo PC di solito ha un solo schermo per visualizzare la grafica, il tuo codice deve unire la grafica che crea nella stessa immagine utilizzata da Windows. Per tale motivo, è necessario condividere un singolo oggetto "grafico". Il modo principale in cui il codice è in grado di utilizzare quell'oggetto "grafica" è utilizzare il parametro e che viene passato all'evento OnPaint con l'oggetto PaintEventArgs.
Protected Overrides Sub OnPaint (
ByVal e As System.Windows.Forms.PaintEventArgs)
Dim g As Graphics = e.Graphics
Cos'altro puoi fare con questi parametri? Per illustrare, supponiamo che tu voglia scoprire se una stringa, forse qualcosa che hai inserito in una casella di testo, esiste in una qualsiasi di una raccolta di altre caselle di testo quando fai clic su una. Puoi codificare alcune dozzine di subroutine praticamente identiche per ogni casella di testo:
Se TextBox42.Text.IndexOf (
SearchString.Text) = -1
Quindi NotFound.Text =
"Non trovato"
Ma è molto più facile codificarne solo uno e lasciarlo gestire tutti. Il parametro mittente rivelerà quale casella di testo è stata selezionata.
Sottotitoli privati FindIt (
Mittente ByVal come System.Object,
ByVal e As System.EventArgs
) Gestisce TextBox1.Enter,
TextBox2.Enter,
... e ancora e ancora ...
TextBox42.Enter
Dim myTextbox As TextBox
myTextbox = mittente
Dim IndexChar As Intero =
myTextbox.Text.IndexOf (
SearchString.Text)
Se IndexChar = -1, allora _
NotFound.Text = "Non trovato" _
Altro _
NotFound.Text = "Found It!"
End Sub
Di recente, un programmatore mi ha chiesto un modo migliore per "eliminare la riga su cui è stato fatto clic in uno dei sei elenchi specificati". L'ha fatto funzionare in un paio di dozzine di righe di codice che mi hanno semplicemente confuso. Ma usando il mittente, era davvero abbastanza semplice:
Elenco secondario privatoBox_Click (
Mittente ByVal come oggetto,
ByVal e As System.EventArgs
) Gestisce ListBox1.Click, ListBox2.Click
Dim myListBox come nuovo ListBox
myListBox = mittente
myListBox.Items.RemoveAt (myListBox.SelectedIndex)
End Sub
Un altro esempio per chiarire il punto è una domanda che è stata inviata da Pierre in Belgio. Pierre stava testando l'uguaglianza di Button1 e del mittente usando il È operatore per oggetti:
Se il mittente è Button1, allora ...
Ciò è sintatticamente corretto perché mittente e Button1 sono entrambi oggetti a cui è possibile fare riferimento. E poiché il mittente è davvero identico a Button1, perché non funziona?
La risposta dipende da una parola chiave che si trova poco prima nell'istruzione. Innanzitutto, controlliamo la documentazione Microsoft per il È operatore.
Visual Basic confronta due variabili di riferimento all'oggetto con l'operatore Is. Questo operatore determina se due variabili di riferimento si riferiscono alla stessa istanza di oggetto.
Si noti che il mittente è stato superato ByVal. Ciò significa che viene passata una copia di Button1, non l'oggetto reale stesso. Quindi, quando Pierre verifica se mittente e Button1 sono la stessa istanza, il risultato è Falso.
Per verificare se è stato fatto clic su Button1 o Button2, è necessario trasformare il mittente in un oggetto Button effettivo e quindi testare una proprietà di tale oggetto. Di solito viene utilizzato il testo, ma è possibile verificare un valore in Tag o anche nella proprietà Location.
Questo codice funziona:
Dim myButton come pulsante
myButton = mittente
Se myButton.Text = "Button1" Quindi