I moduli (Module) in Visual Basic sono storicamente utilizzati per memorizzare procedure, funzioni e variabili disponibili in tutto il progetto senza la necessità di creare esplicitamente un'istanza. Con l'introduzione delle classi, i loro ruoli si sovrappongono in parte, tuttavia le differenze sostanziali sono rimaste.
Storia della questione:
Nel classico Visual Basic (VB6) i moduli erano l'unico modo per raggruppare funzioni comuni e variabili globali. In VB.NET i moduli sono rimasti, ma con possibilità ampliate dalle classi.
Problema:
Lo sviluppatore potrebbe non comprendere la differenza tra un modulo e una classe, il che porta a una scelta errata su come memorizzare la logica, a duplicazioni casuali di codice o a comportamenti inaspettati delle variabili.
Soluzione:
La scelta tra modulo e classe dipende dagli obiettivi:
Esempio di codice:
' Modulo Module MathUtils Public Function Add(x As Integer, y As Integer) As Integer Return x + y End Function End Module ' Utilizzo Dim result = MathUtils.Add(5, 10)
Caratteristiche principali:
Shared e accessibili senza istanza.Se dichiaro una variabile in un modulo come Public, sarà comune a tutti i form/classi dell'applicazione?
Sì. Le variabili Public in un modulo sono sostanzialmente globali. Sono accessibili da qualsiasi codice del progetto, il che è comodo, ma può portare a errori in scenari di multithreading o a sovrascritture casuali di valori.
Posso creare un'istanza di un modulo con New?
No. I moduli non possono essere istanziati. Tutta la loro funzionalità è disponibile staticamente.
È possibile ereditare un modulo o dichiararlo con modificatori di accesso Protected o Private?
No. I moduli non sono ereditabili e possono essere dichiarati solo a livello di namespace, non possono essere annidati o avere altri modificatori di accesso, oltre a Public o Friend.
In un progetto, tutte le variabili di stato dell'utente sono dichiarate come Public in un modulo. Con qualsiasi modifica di valore in un form, diventa immediatamente nuovo per tutti gli altri.
Pro:
Contro:
Il modulo è utilizzato solo per memorizzare utility ausiliarie (ad esempio, funzioni di conversione), mentre lo stato dell'utente è memorizzato in classi con incapsulamento.
Pro:
Contro: