Esperimento:
Ho trovato che possibile è possibile definire sia un "Modulo" (Namespace?) sia una "Classe" (Namespace?) all'interno di un singolo elemento .Vb (Modulo ??).
Puoi provarlo a casa:
- Crea un nuovo progetto di applicazione per console.
* Un nuovo elemento .Vb denominato "Module1.Vb" viene automaticamente aggiunto al progetto. - Aggiungi un nuovo elemento
Class
.Vb facendo clic con il pulsante destro del mouse sul progetto in Esplora soluzioni > Aggiungi > Classe ... - Dai alla nuova classe il nome
Test
. - Visualizza il codice per "Test.Vb" e incolla quanto segue:
Imports System.Runtime.CompilerServices
Module ExtensionsTest
<Extension()>
Public Sub ToConsole(ByVal Ex As Exception)
Dim ForeColor As ConsoleColor
Console.ForegroundColor = ConsoleColor.Red
Console.WriteLine()
Console.WriteLine("An unhandled exception has occurred!")
Console.WriteLine(Ex.ToString)
Console.ForegroundColor = ForeColor
End Sub
End Module
Class Test
Public Sub Test()
Try
Dim test As New Object
test.SomeMethodDoesntExist()
Catch ex As Exception
ex.ToConsole()
End Try
End Sub
End Class
Visualizza il codice per il modulo 1 e incolla quanto segue:
Module Module1
Sub Main()
Try
Dim tester As New Test
tester.Test()
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Sub
End Module
Ora vai avanti e passa o esegui l'applicazione. Vedrai tutto funziona. Quindi, passiamo al ...
Carne della domanda
Questa pratica è accettabile? Potrebbe essere tecnicamente possibile - ma è una soluzione cattiva per ragioni che non conosco? (Sono un Mort e davvero non voglio prendere inconsapevolmente cattive pratiche di codifica)
Inizialmente avevo questo come metodo Private
all'interno della definizione di classe come questa:
Imports System.Runtime.CompilerServices
Class Test
Public Sub Test()
Try
Dim test As New Object
test.SomeMethodDoesntExist()
Catch ex As Exception
ToConsole(ex)
End Try
End Sub
Private Sub ToConsole(ByVal Ex As Exception)
Dim ForeColor As ConsoleColor
Console.ForegroundColor = ConsoleColor.Red
Console.WriteLine()
Console.WriteLine("An unhandled exception has occurred!")
Console.WriteLine(Ex.ToString)
Console.ForegroundColor = ForeColor
End Sub
End Class
Ho deciso che sarebbe stato più pulito definire il ToConsole
sub come metodo di estensione per Exception
oggetti, ma è lì che ho incontrato dei problemi. Quando ho creato l'attributo Extension
nello spazio dei nomi Class
, ho ricevuto un errore del compilatore:
Extension methods can be defined only in modules.
Quindi, ho provato l'esperimento precedente e ho dichiarato un Module
nello stesso elemento .VB in cui è definito il mio Class
.
Come mostra l'esperimento sopra riportato, tutto questo si compila bene e funziona come previsto, ma mi piacerebbe sapere se questa è una buona idea oppure no, e perché?
Grazie per aver dedicato del tempo a leggere questo e ancora più grazie per il tempo impiegato a commentare o rispondere!