Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Meta en 2 Marzo 2023, 21:09 pm



Título: Muestra en consola el nombre de la variable, no su contenido
Publicado por: Meta en 2 Marzo 2023, 21:09 pm
Hola:

Como curiosidad y novedades del .NET 7.0 o por ahí.

Una cosa es mostrar el contenido de una variable que tiene un texto, otra cosa es mostrar el nombre de la variable. Hace años intentado por mi ignorancia, mostrar el nombre de la variable y ya está.

Hoy en día.

¿Para qué mostrar el nombre de una variable?

Lo que he hecho en el programa de abajo es:
Mostrar el nombre de la variable.
Mostrar el contenido de esa variable.
Mostrar nombre y contenido de la variable.

Código C#:
Código
  1. // Variable.
  2. string soyUnaVariable = "Esto es el contenido de la Variable soyUnaVariable.";
  3.  
  4. // Imprime nombre de la variable.
  5. Console.WriteLine(nameof(soyUnaVariable));
  6.  
  7. // Imprime el contenido de la variable.
  8. Console.WriteLine(soyUnaVariable);
  9. Console.WriteLine();
  10.  
  11. // Imprime nombre de la variable y su contenido.
  12. Console.WriteLine(nameof(soyUnaVariable) + " = " + soyUnaVariable);
  13. Console.WriteLine();
  14.  
  15. // Lo mismo pero otra forma de mostarlo en pantalla.
  16. Console.WriteLine("{0} = {1}", nameof(soyUnaVariable), soyUnaVariable);
  17.  
  18. // Pulse cualquier tecla para salir.
  19. Console.ReadKey();

Solo quiero saber que utilidad puede tener.

Lo único que se me ocurre es no usar el depurador paso a paso del IDE para ver que contiene, aquí lo hace en tiempo real.

Saludos.


Título: Re: Muestra en consola el nombre de la variable, no su contenido
Publicado por: Tachikomaia en 2 Marzo 2023, 22:07 pm
Sólo le veo utilidad si el nombre es generado según variables que desconoces. Por ejemplo si pones una lista de posibles nombres y creas una variable con un nombre al azar de entre ellos, te puede servir. Normalmente se usaría Personaje1Ubicacion por ejemplo, en vez de PablitoUbicacion, pero capaz que en algún caso conviene hacerlo así.
Pero tú llamas a la variable sabiendo el nombre, en este caso no lo sabrías, tendrías que guardarlo en una variable cuando se genere.

Últimamente estoy pensando en representar visualmente los grafos que se producen en mis buscadores de las series más cortas de acciones (puede sonar muy complejo pero sólo lo apliqué en cosas muy simples, y capaz que ni siquiera se llaman así, pero es que fuerza bruta tampoco creo que sea), hace como 1 año que no toco eso pero, si mal no recuerdo se crean variables cuyos nombres describen una situación y el contenido es qué acción se realizó antes de que se produjeran y/o cual era la situación anterior, no me acuerdo, pero, en este caso puede que convenga mostrar el nombre de la variable.
Te busco algún code porque imagino que eso no está bien explicado, pero como digo estoy fuera de práctica así que no esperes gran cosa.
Código
  1.   actions for fotograma 1
  2.      // Situación inicial.
  3.      BaseHP = 10;
  4.      Action = 1;
  5.      BaseEnHP = 10;
  6.      // Guardar Situación inicial.
  7.      SitID = "S"+BaseHP+"_"+BaseEnHP;
  8.      set (SitID+"HP", BaseHP);
  9.      set (SitID+"EnHP", BaseEnHP);
  10.      set (SitID+"Action", "Ninguno");
  11.      // Variables de Unsolved situaciones.
  12.      U = 0;
  13.      Us = 0;
  14.   actions for fotograma 2
  15.      // Reset Situación.
  16.      HP = BaseHP;
  17.      EnHP = BaseEnHP;
  18.      trace ("La sit es: "+HP+"_"+EnHP);
  19.      // Aplicación.
  20.      trace ("Player attacks with "+Action+"!");
  21.      EnHP = EnHP-Action;
  22.      trace ("EnHP reducido a: "+EnHP);
  23.      // ¿Sol?
  24.      if (EnHP<=0) {
  25.         // Solución; iniciar mostrar lista.
  26.         List = Action;
  27.         gotoAndPlay (4);
  28.      } else {
  29.         // Sino, ambos están OK.
  30.         // Efecto.
  31.         trace ("Enemy attacks!");
  32.         HP = HP-1;
  33.         trace ("HP reducido a: "+HP);
  34.         if (0<HP) {
  35.            // Ambos están OK.
  36.            // ¿La situación está anotada?
  37.            if (eval("S"+HP+"_"+EnHP+"HP") == undefined) {
  38.               // No. Anotarla.
  39.               SitID = "S"+HP+"_"+EnHP;
  40.               set (SitID+"HP", BaseHP);
  41.               set (SitID+"EnHP", BaseEnHP);
  42.               set (SitID+"Action", Action);
  43.               trace ("Nueva sit anotada: "+SitID);
  44.               Us = Us+1;
  45.               SitID = "U"+Us;
  46.               set (SitID+"HP", HP);
  47.               set (SitID+"EnHP", EnHP);
  48.            }
  49.            // Sino, el enemigo ganó.
  50.         }
  51.      }
  52.   actions for fotograma 3
  53.      // La situación existe o el jugador perdió.
  54.      // ¿Modificar candidato es posible?
  55.      if (Action<3) {
  56.         // Modificación de candidato.
  57.         Action = Action+2;
  58.         gotoAndPlay (2);
  59.      } else if (U<Us) {
  60.         // Usar Unsolved.
  61.         U = U+1;
  62.         BaseHP = eval("U"+U+"HP");
  63.         BaseEnHP = eval("U"+U+"EnHP");
  64.         Action = 1;
  65.         gotoAndPlay (2);
  66.      } else {
  67.         // No hay Solución.
  68.         List = "No hay sol";
  69.         stop ();
  70.      }
  71.   actions for fotograma 5
  72.      SitID = eval("S"+BaseHP+"_"+BaseEnHP+"Action");
  73.      Base2HP = BaseHP;
  74.      BaseHP = eval("S"+BaseHP+"_"+BaseEnHP+"HP");
  75.      BaseEnHP = eval("S"+Base2HP+"_"+BaseEnHP+"EnHP");
  76.      if (SitID != "Ninguno") {
  77.         List = SitID+" "+List;
  78.         gotoAndPlay (4);
  79.      } else {
  80.         stop ();
  81.      }
  82.   }
  83.  

Con los codes que dicen set aquí
Código:
      BaseHP = 10;
      Action = 1;
      BaseEnHP = 10;
      // Guardar Situación inicial.
      SitID = "S"+BaseHP+"_"+BaseEnHP;
      set (SitID+"HP", BaseHP);
      set (SitID+"EnHP", BaseEnHP);
      set (SitID+"Action", "Ninguno");
Se crean estas variables:
S10_10HP = 10
S10_10EnHP = 10
S10_10Action = "Ninguno"
Si mal no recuerdo significa que la situación anterior a la inicial fue ella misma (lo cual se interpreta como que fue ninguna) y que la acción conque se produjo fue ninguna.

Tendríamos S10_10 en pantalla, indicando cómo era la 1era situación, el inicio del grafo.

Código:
            // ¿La situación está anotada?
            if (eval("S"+HP+"_"+EnHP+"HP") == undefined) {
               // No. Anotarla.
               SitID = "S"+HP+"_"+EnHP;
               set (SitID+"HP", BaseHP);
               set (SitID+"EnHP", BaseEnHP);
               set (SitID+"Action", Action);
Esto se realiza luego de que los rivales se golpeen y sólo si ambos sobreviven. El ataque usado por la IA que intenta aprender "el camino más corto" (hacia vencer a su rival) fue el que hace 1 punto de daño, el enemigo usa ese ataque siempre, por lo que ahora tenemos:
S9_9HP = 10
S9_9EnHP = 10
S9_9Action = 1
Significa que ahora ambos luchadores tienen 9 HP, antes tenían 10, y la acción usada por la IA fue la 1.

Entonces, el grafo ahora es:
S10_10
      |
      | 1
      V
S9_9
Próximamente se regresa a la situación anterior, y si hay otra acción posible se realiza, la cual es quitar 3 HP en vez de 1, lo que nos da...
            3
S10_10 ---> S9_7
      |
      | 1
      V
S9_9
Pero creo que los que saben del tema saben nombrar a las situaciones como les de la gana o no sé bien qué hacen, tenía un libro donde hacían esto pero lo presté y no me lo devolvió el mr.


Título: Re: Muestra en consola el nombre de la variable, no su contenido
Publicado por: Meta en 5 Marzo 2023, 02:50 am
Buena explicación. ;-)