Imitar ordenador de los cines de antes en cuanto al sonido

Iniciado por Meta, 12 Febrero 2016, 07:44 AM

0 Miembros y 1 Visitante están viendo este tema.

Meta

Hola:

Como en las películas de antes, no recuerdo en qué peli sale, un ordenador que al imprimir mensajes, se oye un ruido por cada letra muy rápido.

Hice lo de imprimir cada letra en 10 milisegundos, 0.010 segundos.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Threading; // No olvidar.

namespace Texto_consola_CS
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WindowWidth = 80;
            Console.WindowHeight = 43;

            Console.Title = "Título del programa en la ventana de la consola.";

            Console.BackgroundColor = ConsoleColor.Black; // Fondo pantalla blanco.
            Console.Clear(); // Limpiar pantalla.
            Console.ForegroundColor = ConsoleColor.Green; // Color texto azul.

            string Cadena = @"El hombre moderno es un viajero que ha olvidado el lugar de donde va, y que
ha de volver a donde viene para saber a donde va.

No busques al amigo para matar las horas, sino búscale con horas para vivir.

Los amigos se convierten con frecuencia en ladrones de nuestro tiempo.

Es difícil decir quién hace el mayor daño: los enemigos con sus peores intenciones o los amigos con las mejores.

Recorre a menudo la senda que lleva al huerto de tu amigo, no sea que la maleza te impida ver el camino.";

            Console.CursorVisible = true;

            foreach (char Letra in Cadena)
            {
                Console.Write(Letra);
                Thread.Sleep(2); //medio segundo
            }
            Console.Beep();
            Console.ReadKey(); // Pulse cualquier tecla para salir.
        }
    }
}


Al final de impresión de oye un beep. No encuentro un vídeo de ejemplo por ahora para que vean a lo que me refiero. Cuando el hombre habla con el ordenador en la película y le responde con mesajes que se oye el ruido por cada letra que escriba en pantalla.

Si alguien sabe como se hace, lo explican, no he encontrado nada igual por Internet, lo más parecido es esto.

https://msdn.microsoft.com/es-es/library/4fe3hdb1%28v=vs.110%29.aspx

Pero no es lo mismo.

Cualquier información es de ayuda.

Saludos.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

Meta

Me respondo a  mi mismo.

Código (csharp) [Seleccionar]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Threading; // No olvidar.

namespace Texto_consola_CS
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WindowWidth = 80;
            Console.WindowHeight = 43;

            Console.Title = "Título del programa en la ventana de la consola.";

            Console.BackgroundColor = ConsoleColor.Black; // Fondo pantalla blanco.
            Console.Clear(); // Limpiar pantalla.
            Console.ForegroundColor = ConsoleColor.Green; // Color texto azul.

            string Cadena = @"El hombre moderno es un viajero que ha olvidado el lugar de su destino, y que
ha de volver a donde viene para saber a donde va.

No busques al amigo para matar las horas, sino búscale con horas para vivir.

Los amigos se convierten con frecuencia en ladrones de nuestro tiempo.

Es difícil decir quién hace el mayor daño: los enemigos con sus peores intenciones o los amigos con las mejores.

Recorre a menudo la senda que lleva al huerto de tu amigo, no sea que la maleza te impida ver el camino.";

            Console.CursorVisible = true;

            foreach (char Letra in Cadena)
            {
                Console.Write(Letra);
                Console.Beep(500, 60);
            }
            Console.ReadKey(); // Pulse cualquier tecla para salir.
        }
    }
}


Saludos.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

Lekim

#2
Hola

Interesante tu idea y buen aporte. Pero no me convence el sonido. Creo que solo debería hacer 'tic' cuando surja un carácter y no tan seguido. Similar a una máquina de escribir pero con sonido electrónico.

Usando tu código he hecho algún cambio (está en C#). A ver que te parece.



using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;


static class Module1
{



public static void Main()
{


Console.WindowWidth = 80;
Console.WindowHeight = 43;

Console.Title = "Título del programa en la ventana de la consola.";

Console.BackgroundColor = ConsoleColor.Black;
// Fondo pantalla blanco.
Console.Clear();
// Limpiar pantalla.
Console.ForegroundColor = ConsoleColor.Green;
// Color texto azul.


string Cadena = string.Format("{1}{0}{0}{2}{0}{0}{3}{0}{0}{4}", Environment.NewLine, "CÓDIGO DE ACCESO:_ 59898OP-NEI56", "***CÓDIGO DE ACCESO DENEGADO***", "█ POR FAVOR, INTRODUZCA DE NUEVO EL CÓDIGO DE ACCESO █", "CÓDIGO DE ACCESO:_ ");


Console.CursorVisible = true;

foreach (char Letra in Cadena) {
//Espera 5 segundos

System.Threading.Thread.Sleep(0.09 * 1000);
if (Letra == Convert.ToChar(Environment.NewLine)) {
System.Threading.Thread.Sleep(0.75 * 1000);
//Espera 0.75 segundos antes de hacer el salto de línea
Console.Beep(600, 100);
// beep de salto de línea
}
Console.Write(Letra);
// Hacer sonido solo cuando el caracter sea distinto de espacio
if (string.IsNullOrWhiteSpace(Letra) == false) {
Console.Beep(500, 9);
}
}
Console.ReadKey();
// Pulse cualquier tecla para salir.



}




}

//=======================================================
//Service provided by Telerik (www.telerik.com)
//Conversion powered by NRefactory.
//Twitter: @telerik
//Facebook: facebook.com/telerik
//=======================================================


Lo suyo sería también, poder cambiar el tipo de fuente.

Saludos




En vb.net

Module Module1



   Sub Main()


       Console.WindowWidth = 80
       Console.WindowHeight = 43

       Console.Title = "Título del programa en la ventana de la consola."

       Console.BackgroundColor = ConsoleColor.Black
       ' Fondo pantalla blanco.
       Console.Clear()
       ' Limpiar pantalla.
       Console.ForegroundColor = ConsoleColor.Green
       ' Color texto azul.


       Dim Cadena As String = String.Format("{1}{0}{0}{2}{0}{0}{3}{0}{0}{4}", Environment.NewLine,
                                             "CÓDIGO DE ACCESO:_ 59898OP-NEI56",
                                            "***CÓDIGO DE ACCESO DENEGADO***",
                                             "█ POR FAVOR, INTRODUZCA DE NUEVO EL CÓDIGO DE ACCESO █",
                                             "CÓDIGO DE ACCESO:_ ")

 
       Console.CursorVisible = True

       For Each Letra As Char In Cadena
           'Espera 5 segundos

           System.Threading.Thread.Sleep(0.09 * 1000)
           If Letra = CChar(Environment.NewLine) Then
               System.Threading.Thread.Sleep(0.75 * 1000) 'Espera 0.75 segundos antes de hacer el salto de línea
               Console.Beep(600, 100) ' beep de salto de línea
           End If
           Console.Write(Letra)
           If String.IsNullOrWhiteSpace(Letra) = False Then ' Hacer sonido solo cuando el caracter sea distinto de espacio
               Console.Beep(500, 9)
           End If
       Next
       Console.ReadKey()
       ' Pulse cualquier tecla para salir.



   End Sub




End Module


Por cierto la película a la que te refieres podría ser JUEGOS DE GUERRA (1983)

(ahora que recuerdo, creo que en esta película el ordenador hablaba  ;D)




Código de acceso denegado... jaja. Bueno, me aburría y quise hacer una versión funcional. Qué recuerdos...

C#
using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
static class Module1
{

public static void Main()
{
Console.WindowWidth = 80;
Console.WindowHeight = 43;
Console.Title = "Retro-Consola";
Console.BackgroundColor = ConsoleColor.Black;
// Fondo pantalla blanco.
Console.Clear();
// Limpiar pantalla.
Console.ForegroundColor = ConsoleColor.Green;
// Color texto azul.
Console.CursorVisible = false;
1:
string Cadena = string.Format("{0}{1}{0}{0}{2}", Environment.NewLine, "█ POR FAVOR, INTRODUZCA EL CÓDIGO DE ACCESO █", "CÓDIGO DE ACCESO:_ ");

Mecanografiar(Cadena);

string Entrada = Console.ReadLine;

if (Entrada == 12345) {
Cadena = string.Format("{0}{1}{0}{0}{2}{0}{3}{0}{4}", Environment.NewLine, "*** CÓDIGO DE ACCESO ACEPTADO ***", "████████████████████████████████████████", "█     BIENVENIDO DOCTOR FRANKESTEIN    █", "████████████████████████████████████████");
Mecanografiar(Cadena);
} else {
Cadena = string.Format("{0}{1}{0}", Environment.NewLine, "*** CÓDIGO DE ACCESO DENEGADO ***");
Mecanografiar(Cadena);
goto 1;
}
Console.ReadKey();
}
public static void Mecanografiar(string Cadena)
{
foreach (char Letra in Cadena) {
//Espera 5 segundos
if (Letra == Convert.ToChar(Environment.NewLine)) {
System.Threading.Thread.Sleep(0.75 * 1000);
//Espera 0.75 segundos antes de hacer el salto de línea
Console.Beep(600, 100);
// beep de salto de línea
} else {
System.Threading.Thread.Sleep(0.09 * 1000);
Console.Write(Letra);
// Hacer sonido solo cuando el caracter sea distinto de espacio
if (string.IsNullOrWhiteSpace(Letra) == false) {
Console.Beep(500, 9);
}
}

}
}
}

//=======================================================
//Service provided by Telerik (www.telerik.com)
//Conversion powered by NRefactory.
//Twitter: @telerik
//Facebook: facebook.com/telerik
//=======================================================



VBNET
Module Module1

   Sub Main()
       Console.WindowWidth = 80
       Console.WindowHeight = 43
       Console.Title = "Retro-Consola"
       Console.BackgroundColor = ConsoleColor.Black' Fondo pantalla blanco.
       Console.Clear()' Limpiar pantalla.
       Console.ForegroundColor = ConsoleColor.Green' Color texto azul.
       Console.CursorVisible = False
1:
       Dim Cadena As String = String.Format("{0}{1}{0}{0}{2}", Environment.NewLine,
                                           "█ POR FAVOR, INTRODUZCA EL CÓDIGO DE ACCESO █",
                                           "CÓDIGO DE ACCESO:_ ")

       Mecanografiar(Cadena)

       Dim Entrada As String = Console.ReadLine

       If Entrada = 12345 Then
           Cadena = String.Format("{0}{1}{0}{0}{2}{0}{3}{0}{4}", Environment.NewLine,
                               "*** CÓDIGO DE ACCESO ACEPTADO ***",
                               "████████████████████████████████████████",
                               "█     BIENVENIDO DOCTOR FRANKESTEIN    █",
                               "████████████████████████████████████████")
           Mecanografiar(Cadena)
       Else
           Cadena = String.Format("{0}{1}{0}", Environment.NewLine,
                    "*** CÓDIGO DE ACCESO DENEGADO ***")
           Mecanografiar(Cadena)
           GoTo 1
       End If
       Console.ReadKey()
   End Sub
   Sub Mecanografiar(ByVal Cadena As String)
       For Each Letra As Char In Cadena
           'Espera 5 segundos
           If Letra = CChar(Environment.NewLine) Then
               System.Threading.Thread.Sleep(0.75 * 1000) 'Espera 0.75 segundos antes de hacer el salto de línea
               Console.Beep(600, 100) ' beep de salto de línea
           Else
               System.Threading.Thread.Sleep(0.09 * 1000)
               Console.Write(Letra)
               If String.IsNullOrWhiteSpace(Letra) = False Then ' Hacer sonido solo cuando el caracter sea distinto de espacio
                   Console.Beep(500, 9)
               End If
           End If

       Next
   End Sub
End Module



Meta

Hola:

Que buena pinta tiene el programa. Muchas gracias campeón, lo voy a probar y te cuento.

Que recuerdos. Este si que es una buena peli de hacker básico pero buena. La más nueva que salió hace poco me pareció mala en muchos aspectos, menos cuando salen cosas de programación.


Vi la segunda parte y no es lo mismo. Lo bueno que sale el ordenador el 1.




Ojalá salga el 3.

Probando el último código en C#, lo primero me da errores por todas partes, y nunca había visto usar goto que se aconseja no usarlo en C# ni en Visual Basic para evitar malos hábitos.

Saludos.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

Lekim

#4
Cita de: Meta en 27 Febrero 2016, 15:30 PM
Probando el último código en C#, lo primero me da errores por todas partes, y nunca había visto usar goto que se aconseja no usarlo en C# ni en Visual Basic para evitar malos hábitos.
Saludos.

:P Normal, ni siquiera lo he testeado jaja. Simplemente he usado una conversión online y luego lo pegué.

De todos modos  básicamente lo que interesa es la función Mecanografiar para hacer los efectos de sonido.

En cuanto el uso de GOTO, antiguamente en Basic se usaba muchísimo, y en tal caso no veo porqué no.  Yo tuve un ordenador Sharp que funcionaba con Basic y un Commodore64 y era bastante habitual.


Saludos




Pues, así es. En C# no funciona  :-[

Para empezar C# no permite esto (y supongo que tampoco en C++):
 System.Threading.Thread.Sleep(0.09 * 1000);

Es decir, usar un valor temporal inferior a un segundo de este modo (0.09 * 1000). En lugar de eso simplemente poner, por ejemplo:

 System.Threading.Thread.Sleep(100);

Esto es imprescindible para conseguir el efecto  de tecla (tac, tac, tac,...) pues, sólo hace un tic similar a una tecla, sin determinarse claramente que sonido suena.

[CORREGIDO EN C#]

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
   class Program
   {
public static void Main()
{
Console.WindowWidth = 80;
Console.WindowHeight = 43;
Console.Title = "Retro-Consola";
Console.BackgroundColor = ConsoleColor.Black;
// Fondo pantalla blanco.
Console.Clear();
// Limpiar pantalla.
Console.ForegroundColor = ConsoleColor.Green;
// Color texto azul.
Console.CursorVisible = false;
j1:;
string Cadena = string.Format("{0}{1}{0}{0}{2}", Environment.NewLine, "█ POR FAVOR, INTRODUZCA EL CÓDIGO DE ACCESO █", "CÓDIGO DE ACCESO:_ ");

Mecanografiar(Cadena);
       string Entrada;
Entrada = Console.ReadLine();

if (Entrada == "12345") {
Cadena = string.Format("{0}{1}{0}{0}{2}{0}{3}{0}{4}", Environment.NewLine, "*** CÓDIGO DE ACCESO ACEPTADO ***", "████████████████████████████████████████", "█     BIENVENIDO DOCTOR FRANKESTEIN    █", "████████████████████████████████████████");
Mecanografiar(Cadena);
} else {
Cadena = string.Format("{0}{1}{0}", Environment.NewLine, "*** CÓDIGO DE ACCESO DENEGADO ***");
Mecanografiar(Cadena);
           goto j1;
}
Console.ReadKey();
}

       public static void Mecanografiar(string Cadena)
       {
           foreach (char Letra in Cadena)
           {
             
               if ((Letra) == Convert.ToChar(ConsoleKey.Enter))

               {
                   System.Threading.Thread.Sleep(750);
                   //Espera 0.75 segundos antes de hacer el salto de línea
                   Console.Beep(600, 100);
                   // beep de salto de línea
               }
               else
               {
                   System.Threading.Thread.Sleep(90);
                   Console.Write(Letra);
                   // Hacer sonido solo cuando el caracter sea distinto de espacio
                   if ((Letra) != Convert.ToChar(ConsoleKey.Spacebar))
                   {
                       Console.Beep(500, 9);
                   }
               }
           }
       }


      }

    }




La función para crear el efecto:
Código (csharp) [Seleccionar]
 
public static void Mecanografiar(string Cadena)
       {
           foreach (char Letra in Cadena)
           {

               if ((Letra) == Convert.ToChar(ConsoleKey.Enter))
               {
                   
                   System.Threading.Thread.Sleep(750);
                   //Espera 0.75 segundos antes de hacer el salto de línea
                   Console.Beep(600, 100);
                   // beep de salto de línea
               }
               else
               {
                   System.Threading.Thread.Sleep(90);
                   Console.Write(Letra);
                   // Hacer sonido solo cuando el caracter sea distinto de espacio
                   if ((Letra) != Convert.ToChar(ConsoleKey.Spacebar))
                   {
                       Console.Beep(500, 9);
                   }
               }
           }
       }
   


Para modificar la velocidad cambia el valor de 90 a menos o más según prefieras:

System.Threading.Thread.Sleep(90)

En un principio puse 130, pero es demasiado lento. Creo que 90 está bien.

Saludos




Puede usarse TimeSpan en lugar de usarse Sleep del siguiente modo:

Código (csharp) [Seleccionar]
    TimeSpan interval = new TimeSpan(0, 0, 0, 0, 90);
                   Thread.Sleep(interval);


Ejemplo:

Código (csharp) [Seleccionar]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace ConsoleApplication2
{
   class Program
   {
       static void Main(string[] args)
       {
           string cadena = "Ejemplo de como usar TimeSpan..." +
           Environment.NewLine  +
           "... En lugar de usar Speep";

           Mecanografiar(cadena);

       }
       public static void Mecanografiar(string Cadena)
       {
           foreach (char Letra in Cadena)
           {

               if ((Letra) == Convert.ToChar(ConsoleKey.Enter))
               {
                   TimeSpan interval = new TimeSpan(0, 0, 0, 0, 500);
                   Thread.Sleep(interval);
                   //System.Threading.Thread.Sleep(750);
           
                   //Espera 0.75 segundos antes de hacer el salto de línea
                   Console.Beep(600, 100);
                   // beep de salto de línea
               }
               else
               {
                   TimeSpan interval = new TimeSpan(0, 0, 0, 0, 90);
                   Thread.Sleep(interval);
                  // System.Threading.Thread.Sleep(90);
                   Console.Write(Letra);
                   // Hacer sonido solo cuando el caracter sea distinto de espacio
                   if ((Letra) != Convert.ToChar(ConsoleKey.Spacebar))
                   {
                       Console.Beep(500, 9);
                   }
               }
           }
       }



   }
}

Meta

¡¡¡¡Holaaaaaaaaaaaaaa!!!!

El último código lo hicieste de p**a madre con pausas en los espacios y todo.
Código (csharp) [Seleccionar]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            string cadena = "Ejemplo de como usar TimeSpan..." +
            Environment.NewLine +
            "... En lugar de usar Speep";

            Mecanografiar(cadena);

        }
        public static void Mecanografiar(string Cadena)
        {
            foreach (char Letra in Cadena)
            {

                if ((Letra) == Convert.ToChar(ConsoleKey.Enter))
                {
                    TimeSpan interval = new TimeSpan(0, 0, 0, 0, 500);
                    Thread.Sleep(interval);
                    System.Threading.Thread.Sleep(750);

                    //Espera 0.75 segundos antes de hacer el salto de línea
                    Console.Beep(600, 100);
                    // beep de salto de línea
                }
                else
                {
                    TimeSpan interval = new TimeSpan(0, 0, 0, 0, 90);
                    Thread.Sleep(interval);
                    // System.Threading.Thread.Sleep(90);
                    Console.Write(Letra);
                    // Hacer sonido solo cuando el caracter sea distinto de espacio
                    if ((Letra) != Convert.ToChar(ConsoleKey.Spacebar))
                    {
                        Console.Beep(500, 9);
                    }
                }
            }
        }
    }
}


Sólo me falta odificar los colores y hacer lo que me da la gana con tu estilo.

Por cierto, me gustó mucho esto.


Me recordaste los viejos tiempos. ;)

Hay partes del código que no entiendo, nuevo para mi a la hora de presentar textos en pantalla como este pedazo de código.
Código (csharp) [Seleccionar]
Cadena = string.Format("{0}{1}{0}{0}{2}{0}{3}{0}{4}", Environment.NewLine, "*** CÓDIGO DE ACCESO ACEPTADO ***", "████████████████████████████████████████", "█     BIENVENIDO DOCTOR FRANKESTEIN    █", "████████████████████████████████████████");
                Mecanografiar(Cadena);


El string.Format.
¿Es necesario usar eso así en vez la consola Console.WreiteLine directamente?

Saludos.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

Lekim

#6
Hola Meta

El string.Format.
¿Es necesario usar eso así en vez la consola Console.WreiteLine directamente?


Hombre, necesario no es, pero simplifica bastante la labor, pues {0} en este caso representa Environment.NewLine, y no tengo que estar todo el rato escribiendo Environment.NewLine.

Ejemplo:
Cadena = string.Format("{0} {1} {0} {2} ", "#0", "#1" ,"#2");,
{0} Representa "#0"
{1} Representa "#1"
{2} Representa "#2"

"Cadena"  devuelve:
#0 #1 #0 #2

Por cierto, como ves GeShi para C# no acepta carácteres especiales ASCII como este █ = (Alt + 219). Los cuales te serán muy útiles para conseguir el efecto retro, ya que se usaban estos marcos ╔═════════════════════╗ en lugar de las ventanas o cuadros de mensajes actuales.

Carácteres ASCII





Mientras experimentaba con WriteLine para obtener el valor string de lo escrito en consola, es decir pasarlo a una variable string, he querido crear el efecto de highlightb del texto pero no lo consigo. A ver si alguien sabe como...



Podría ser algo así pero es un palo:

Código (csharp) [Seleccionar]

      string NL = Environment.NewLine;
            string T1 = "Adt Configuration";
            string T2= "DISK SLOT";
            string T3 = "DISK SLOT 2";
            T1 = T1.ToUpper();
     Console.BackgroundColor=ConsoleColor.Green;
     Console.ForegroundColor = ConsoleColor.Black;
     Console.Write("{1} {0}", NL, T1);
     Console.BackgroundColor = ConsoleColor.Black;
     Console.ForegroundColor = ConsoleColor.Green;
     Console.Write("{0}", NL);

     Console.Write("{0}  ", T2);
     Console.BackgroundColor = ConsoleColor.Green;
     Console.ForegroundColor = ConsoleColor.Black;
     Console.Write("{0}  ", "1".PadLeft(5));

Meta

Hola:

Ahora lo entiendo. ;)

Muchas gracias por la ayuda mi muy distinguido amigo. ;)
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

Lekim

En en ejemplo con TimeSpan se me olvidó eliminar la línea 28 :-\

Ya lo he quitado

Código (csharp) [Seleccionar]
  //System.Threading.Thread.Sleep(750);

Creo que no comentaré nada más jeje

saludos  ;)

Eleкtro

#9
Hola

Solo vengo a aclarar una duda que ha surgido en este post a la cual no se le ha dado una respuesta muy acertada.

La instrucción Goto está deprecada desde hace décadas, Visual Basic es un lenguaje que nació de hace décadas, y lo que sigue persistiendo en Visual Basic.Net/C# solo es por mera compatibilidad para aquellos que no quieran perder las malas costumbres al migrar a este lenguaje.

Efectivamente la utilización de la instrucción Goto es totalmente irrecomendable tanto por Microsoft en la MSDN así como de forma no-oficial en cualquier otro lenguaje que soporte Goto y por cualquier programador con los conocimientos suficientes para entender lo que su uso implica, esto se debe a muchos motivos, pero la razón principal es que al utilizarlo estamos destrozando por completo el flujo de control de cualquier algoritmo, el uso de Goto tiende a generar un código spaguetti y esto imposibilita o dificulta la correcta depuración del código.

La instrucción Goto es ineficiente, peligrosa e insegura, y actualmente es algo innecesario en un lenguaje como Vb.Net/C#, ya que .Net Framework nos ofrece una solución eficiente para cualquier tipo de situación, como por ejemplo encapsular el algoritmo en un búcle, o en un bloque try/catch, o simplemente llamar a un método, el tipo de solución más apta dependerá de las circunstancias de nuestro algoritmo claro está.

TL/DR:
Desgraciadamente Microsoft utiliza muchísimo la instrucción Goto en el código fuente de la class Microsoft.VisualBasic (funciones Left, Mid, etc...) y ese es uno de los motivos por los que siempre desaconsejo utilizar esta Class de compatibildiad que no aporta ningún beneficio al programador, no solo por eso, sino por que la lógica programada está deprecada, es de hace décadas, sin actualizaciones de rendimiento, son algoritmos lentos y sucios, y hay alternativas eficientes para cualqueir miembro de esa Class en el resto de la librería de Classes de .Net framework.

Saludos!