Site:  Cours VB.net  
1.16 Le GoTo

Et hop!! On saute..

Le Goto c'est quoi?

Faut-il utiliser le GoTo ?

Goto.

L'instruction GoTo permet de transférer le contrôle à l'emplacement d'une étiquette(on dit parfois un label) locale.
Une étiquette permet de localiser un endroit du code Les étiquettes sont toujours terminées par deux points(:).

Goto permet un saut non conditionnel : aller à, sauter vers une étiquette:

...

GoTo FIN

A=2

B=A+2

FIN:

FIN:  est une étiquette, un mot en début de ligne qui désigne un endroit du code; pour créer une étiquette, taper en début de ligne un mot suggestif de l'endroit, puis ajouter ":".

Le programme saute de la ligne GoTo FIN à l'étiquette FIN: puis se poursuit après FIN (Les instructions entre GoTo FIN et FIN: ne sont pas exécutées :

Le GoTo est souvent utilisé avec une instruction If (pour rendre le saut conditionnel):

If A=0 Then GoTo FIN

..

FIN:

Pourquoi éviter le 'GoTo'.

L'utilisation du GoTo  est peu élégante et à éviter:

Cela casse la structure du code qui se déroule de haut en bas, le cheminement du programme est moins évident, moins visible; s'il y a plusieurs GoTo le programme devient vite illisible.

On parle dans ce cas de "code spaghetti" ou de "code kangourou" (à cause des sauts).

 

Dans la programmation structurée il faut bannir le 'GoTo'. On le remplacera avantageusement par des If..Then et des boucles.

Exemple:

On peut remplacer avantageusement la ligne:

If A=0 Then GoTo FIN

B=1

FIN:

 

par:

If A<>0 Then

    B=1

End if

 

Autre exemple:

Saisir à l'aide d'une InPutBox un nombre. S'il n'est pas entre 1 et 31, ressaisir.

Avec GoTo:

Dim reponse As String

Question:

reponse= InPutBox ("Donner un nombre entre 1 et 31")

If Val(Reponse)<1 Or Val(Reponse) >31 Then GoTo Question

 

Sans GoTo:

Dim reponse As String

While Val(Reponse)<1 Or Val(Reponse) >31

    reponse= InPutBox ("Donner un nombre entre 1 et 31")

Wend

 

 

Quant utiliser le 'GoTo'.

Il est cependant parfois utilisé pour la clarté du code, car il permet de sortir de plusieurs blocs de code qui se suivent.

Exemple: détection d'erreur avant l'écriture sur une fichier.

If Not Exit(File) Then

    errorState=File.NotExist

    GoTo FIN

End if

 

If Not Open(File) Then

    errorState=File.NotOpen

    GoTo FIN

End if

 

If Not Overwrite(File) Then

    errorState=File.NotOverwrite

    GoTo FIN

End if

FIN:

 

C'est propre.

 

Là aussi on aurait pu utiliser des If imbriqués:

 

  If  Exit(File) Then

      If  Open(File) Then

        If  Overwrite(File) Then

            errorState=File.Ok

        Else 

            errorState=File.NotOverwrite

        End if

 

      Else 

            errorState=File.NotOpen

      End if

 

  Else 

            errorState=File.NotExit

  End if

 

La solution avec les GoTo à l'avantage d'être plus lisible.

Pour info, il existe une autre solution élégant et originale utilisant  un Select Case: Les "Case" peuvent contenir n'importe quelle expression.

Select Case true

        Case len(File) = 0 

            msgbox "Pas de nom de fichier"   

        Case Not Exit(File)

            errorState=File.NotExist

        Case Not Open(File)

            errorState=File.NotOpen

        Case Not Overwrite(File)

            errorState=File.NotOverwrite

        Case else

        'placer les exceptions ici

End Select