Come se non bastasse la sua già straordinaria potenza, il namespace My è ulteriormente estendibile dal programmatore, in modo da
adattarlo alle specifiche esigenze dell'applicazione. Prima di utilizzare questa funzionalità, tuttavia, sarebbe opportuno valutare anche
le alternative e concludere se non sia meglio una normale libreria oppure un file serializzato.
Ad ogni modo, è possibile ampliare questo namespace grazie all'ausilio delle classi Partial: infatti My è a tutti gli effetti un normale
namespace, definito in un comune file *.vb, nascosto però agli occhi dello sviluppatore, dato che solo il compilatore lo utilizza. In tale
file vengono definiti solamente i membri inseriti dall'utente e non è assolutamente consigliabile modificarlo manualmente. La soluzione più
corretta consiste, invece, nel dichiarare nel progetto un nuovo namespace, sempre di nome My, che, grazie alla keyword Partial usata dal
compilatore nella creazione automatica, sarà interpretato come estensione di quello originale.
Durante questo processo è possibile aggiungere due tipi di oggetti: di primo e di secondo livello. Quelli di primo livello sono classi definite
all'interno di My con un nome nuovo e ne diventano membri effettivi, in modo da essere resi accessibili con la semplice dicitura My.[Classe].
In questo ambito esistono anche due differenti modi di dichiarare oggetti di questo tipo. Il primo metodo consiste nel creare una nuova classe
all'interno di My:
Namespace My Public Class Utilities 'Con questa versione, si utilizza la classe come contenitore 'di metodi o membri statici, rendendola simile a un modulo Public Shared Function Percent(ByVal Num As Int32, _ ByVal Max As Int32) As Single Return (Num * 100) / Max End Function End Class End Namespace
Il secondo metodo prevede la creazione di un modulo nascosto entro il quale figura una proprietà che espone un'istanza della classe, definita altrove. Infatti, l'infrastruttura di My non espone direttamente i membri Application, Settings, eccetera... ma moduli pubblici nascosti con nomi del tipo MyApplication e MySettings (anteponendo quindi "My" al nome del membro) nei quali vengono definiti tali oggetti come proprietà. Per facilitare la compresione, ecco un esempio simile a quello di prima:
Namespace My 'L'attributo HideModuleName permette di nascondere il 'nome del modulo nella scala gerarchica dell'IntelliSense 'e accedere direttamente a Utilities <DebuggerNonUserCode(), _ Microsoft.VisualBasic.HideModuleName()> _ Public Module MyUtilities Private _Utilities As New Utilities Public ReadOnly Property Utilities() As Utilities Get Return _Utilities End Get End Property End Module End Namespace Public Class Utilities 'Con questa versione, si utilizza la classe come vero oggetto, 'ma i metodi di istanza che non utilizzano altri campi d'istanza 'possono comunque essere utilizzati allo stesso modo dei metodi 'statici, poichè l'oggetto è già inizializzato all'interno del 'modulo sopra definito Public Function Percent(ByVal Num As Int32, _ ByVal Max As Int32) As Single Return (Num * 100) / Max End Function End Class
Per aggiungere, invece, oggetti di secondo livello, ossia gerarchicamente subordinati a uno qualsiasi dei membri già appartenenti a My, basta inserire nel nuovo namespace una classe Partial Friend il cui nome sia formato dal prefisso "My" e dal nome del membro da cui derivare la classe in questione. Ad esempio, questo codice espone il dns di un server usato per le connessioni internet in My.Application:
Namespace My 'Aggiunge membri a My.Application Partial Friend Class MyApplication Private _ServerName As String = "http://www.example.com" Public Property ServerName() As String Get Return _ServerName End Get Set(ByVal Value As String) _ServerName = Value End Set End Property End Class End Namespace