19 messaggi dal 03 ottobre 2018
Ok non aggreditemi per l'abominio che sto per dire :)

In VB.NET, per una sola singola situazione molto particolare mi sarebbe comodo eseguire un'istruzione goto passando come parametro non il nome di un'etichetta di riga direttamente ma una variabile

qualcosa tipo

dim etichetta=risultato_di_una_funzione()

goto etichetta


etichetta1:
[codice sotto etichetta1]

etichetta2:
[codice sotto etichetta2]

etichetta3:
[codice sotto etichetta3]


è possibile?
Grazie
11.886 messaggi dal 09 febbraio 2002
Contributi
Perché ti fai del male in questo modo, figliolo? Non sai che arrivano i velociraptor quando usi i GOTO?
https://xkcd.com/292/


Ok non aggreditemi per l'abominio che sto per dire :)

Nooo, io ti voglio salvare. Ristruttura il codice in questo modo:

dim etichetta=risultato_di_una_funzione()

Select Case etichetta
  Case "etichetta1"
    Metodo1()

  Case "etichetta2"
    Metodo2()

   Case "etichetta3"
    Metodo3()

End Select


Usare i metodi ti permette di testarli individualmente. Tu fai unit testing, vero?

ciao,
Moreno
Modificato da BrightSoul il 15 ottobre 2018 21.36 -

Enjoy learning and just keep making
19 messaggi dal 03 ottobre 2018
No unit testing. Non saprei come approcciarlo l'applicazione è fatta con webforms e non saprei come fare unit testing con web forms.

Venendo al goto, no uno switch non è quello che cerco.
Forse più una serie di if.

La cosa mi interessa solo per una routine specifica che deve aggiornare la struttura di un database.
Se il db si trova ad un certo livello di aggiornamento, devo eseguire solo le istruzioni dei livelli superiori.

Quindi, in metacodice, idealmente quello che vorrei è:

livello=LivelloAggiornamentoDB()

goto "livello" & (livello+1)

livello1:
  AggiornaQui()
  AggiornaLì()

livello2:
  AggiungiUnCampo()
  AggiungineUnAltro()

livello3:
  AggiungiUnaRelazione()
  SpaccaTutto()




Con select case non lo vedo bene, piuttosto si potrebbe fare con IF successivi
livello=LivelloAggiornamentoDB()

if livello=0 then
  AggiornaQui()
  AggiornaLì()
end if

if livello < 1 then
  AggiungiUnCampo()
  AggiungineUnAltro()
end if

if livello <2 then
  AggiungiUnaRelazione()
  SpaccaTutto()
end if



ma "esteticamente" mi risulta più leggibile e logico con il goto.

A parte la soluzione del mio goto, mi rimane il dubbio di come fare a passare un'etichetta variabile al goto, così a livello concettuale.

Grazie ciao
11.886 messaggi dal 09 febbraio 2002
Contributi

come fare a passare un'etichetta variabile al goto

Mi spiace, il linguaggio non ha questa funzionalità.

ciao,
Moreno

Enjoy learning and just keep making
19 messaggi dal 03 ottobre 2018
OK grazie.

E niente uno vuole darsi in pasto ai velociraptor e non ci riesce nonostante le migliori intenzioni!
135 messaggi dal 01 febbraio 2017
rrrobertorrr ha scritto:
OK grazie.

E niente uno vuole darsi in pasto ai velociraptor e non ci riesce nonostante le migliori intenzioni!

Beh, visto che si parla di dinosauri, eccomi qua !

Per fare quello che dici tu (idealmente) devi in ogni caso codificare le vartie label, poichè non puoi fare un goto dinamico senza dichiararne le relative "entrate".

Quindi la soluzione migliore e più logica è il costrutto Select Case già propostoti da Moreno.
Essa risulta anche lineare dal punto di vista dell'immediatezza perchè ha già incorporate le IF che volevi fare , anzi meglio, dato che ti implemeta un goto per ogni condizione, poi .. fai tu !
;-)
Gino.

UNSTRING identifier-1 id-2 id-3
DELIMITED BY [ALL] OR [ALL] literal-1 lit-2
INTO {id-4 [DELIMITER IN id-5]
[COUNT IN id-6]}
[WITH POINTER id-7]
[TALLYING IN id-8]
[ON OVERFLOW imperative-statement-1]
[NOT ON OVERFLOW imper-2]
[END-UNSTRING]
19 messaggi dal 03 ottobre 2018
Il costrutto con il SELECT CASE non è adatto in questo caso perché ti permette di eseguire solo un "CASE" per volta.

Tornando al mio esempio, se io posso avere 10 livelli di aggiornamento, e io ad esempio mi trovo al livello 3, devo eseguire gli aggiornamenti per tutti i livelli superiori, quindi 4, 5, 6, 7, 8, 9 e 10.

Non mi pare che SELECT CASE possa eseguire più case corretto?
Tipo
Select case x
 case is < 1
  '.....
 case is < 2
  '.....
 case is < 3
  '.....
 case is < 4
  '.....
 case is < 5
end select 


se io ho x=1, mi esegue solo il case is < 2 e poi esce, non me le esegue tutte in cascata...
o sì?

Grazie
Ciao
1.490 messaggi dal 27 dicembre 2005
Dentro al Case richiama le altre routine.

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.