Mid$ da VB6 a VB.Net e metodi Extension

Premessa
Come certo sapete, io sono per il ripudio completo delle funzioni ex-VB6 e per la loro sostituzione con i relativi metodi VB.Net.

Prima di Visual Basic 2008, c'era una caratteristica particolare di VB6 che non sembrava sostituibile, se non con un metodo creato a parte. Parlo della funzione Mid$ nella sua sintassi di operando a sinistra di un operatore di assegnazione. Cioè, in VB6 è possibile scrivere codice come questo:

    ' data una stringa
    Dim parola As String
    parola = "casco"

    ' è possibile modificarne un carattere
    ' usando la funzione Mid$ a sinistra dell'operatore di assegnazione
    Mid$(parola, 4, 1) = "t"

    ' e verificare che la parola è diventata "casto"
    MsgBox(parola)

Naturalmente, nel codice si intende: "al carattere nella posizione 4 della parola 'casco' viene assegnato il valore 't'".

In VB.Net non è più possibile avere metodi a sinistra di un operatore di assegnazione. Sembra chissà che perdita, ma in realtà è l'eliminazione di una stortura.

Come non perdere quella funzionalità? La proprietà Chars del tipo String è di sola lettura. Non è quindi possibile codice come:

    parola.Chars(3) = "t"

 Bisogna, evidentemente, ottenere a parte un vettore di caratteri. modificarne uno, ricavarne la stringa risultante. Per tutto questo occorre implementare un metodo in una ipotetica classe StringLib come quella sviluppata a corredo dell'articolo "Altre manipolazioni di stringhe". A esempio:

  Public Shared Function MidReplace(ByVal original As String, ByVal startCharPosition As Integer, _
ByVal replaceCharacter As Char) As String Dim characters As Char() = original.ToCharArray characters(startCharPosition) = replaceCharacter Return String.Concat(characters) End Function

Da usare così:

    parola = MidReplace(parola, 3, "t"c)

Con Visual Basic 2008 sono state introdotti i metodi di estensione, cioè metodi che estendono metodi di altre classi senza per forza derivare le classi stesse. Naturalmente questo si applica anche alle classi del Framework.

I metodi di estensione devono essere definiti in Moduli (non in classi, quand'anche statiche) e per funzionare non richiedono altro che di essere visibili.

Creiamo un Modulo di nome StringExtensions in una libreria StringLib che usiamo sfruttare nei nostri progetti e creiamo un overload esteso del metodo Replace della classe String:

Imports System.Runtime.CompilerServices

Module StringExtensions

  <Extension()> _
  Public Function Replace(ByVal instance As String, ByVal oldCharPosition As Integer, ByVal newChar As Char) As String
    Dim characters As Char() = instance.ToCharArray
    characters(oldCharPosition) = newChar
    Return String.Concat(characters)
  End Function

End Module

Quindi, nel codice di test, impostiamo la direttiva che rende visibile il nuovo metodo (nell'esempio, il namespace è lo stesso dell'applicazione di test. Nella realtà sarà quello della libreria StringLib):

Imports WindowsApplication1.StringExtensions

Quando, nel codice di test, digitiamo "parola = parola." e, scorrendo l'elenco dei membri del tipo String, arrivamo a Replace, troviamo che ora ci sono tre overload e non due, come prima: è accessibile 'anche' il metodo di estensione da noi creato. Diventa quindi possibile scrivere codice come:

    parola = parola.Replace(3, "t"c)

E possiamo NON rimpiangere la vecchia funzione Mid$ di VB6, nemmeno nella sua 'particolarissima' funzionalità.

Print | posted @ giovedì 14 maggio 2009 18:34

Comments have been closed on this topic.