Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

267
Visualizações
¿Las variables conservan su valor en un bucle?

Si ejecuto este código simple en una aplicación de consola:

 For i As Integer = 1 To 10 Dim s As String = i.ToString() Dim x As Decimal If i = 1 Then x = Decimal.Parse(s) End If Console.WriteLine(x.ToString()) Next Console.ReadLine()

Inesperadamente, x retiene su valor de 1, por lo que 1 se imprime 10 veces. Pensé que cada iteración del ciclo era su propio bloque de código y que el estado no se transfirió. ¿Por qué pasó esto? Espero que x tenga el valor predeterminado de System.Decimal .

Lo mismo sucede en C#, excepto que el compilador no le permitirá llamar a ToString() en una variable no inicializada, pero si establece un punto de interrupción en Visual Studio, puede ver que x conserva su valor de 1.

 for (int i = 1; i <= 10; i++) { string s = i.ToString(); Decimal x; if(i == 1) { x = Decimal.Parse(s); } // Value of x remains 1 } Console.ReadLine();
over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

Con respecto a VB.NET, eche un vistazo al alcance aquí . En la sección " Alcance del bloque " hay una nota que dice lo siguiente:

Incluso si el alcance de una variable se limita a un bloque, su tiempo de vida sigue siendo el de todo el procedimiento. Si ingresa el bloque más de una vez durante el procedimiento, cada variable de bloque conserva su valor anterior. Para evitar resultados inesperados en tal caso, es aconsejable inicializar las variables de bloque al principio del bloque.

Entonces, este comportamiento es por diseño y debe inicializar la variable con el valor que necesite su código.

Modifiqué su código para mostrar que la primera vez que x se inicializa en 0, pero luego conserva el valor de 1.

 For i As Integer = 1 To 10 Dim s As String = i.ToString() Dim x As Decimal Console.WriteLine(x.ToString()) If i = 1 Then x = Decimal.Parse(s) End If Console.WriteLine(x.ToString()) Next Console.ReadLine()
over 4 years ago · Santiago Trujillo Relatório

0

pensó que cada iteración del ciclo era su propio bloque de código, y que el estado no se transfirió

Se "transfiere".

int i tiene como alcance todo el rango del ciclo, con valores de 1 a 10.

La declaración if solo se ejecuta en la primera iteración, y x tiene como alcance una variable local para el método externo (suponiendo que se ingrese el bucle), no solo el cuerpo del bucle. Dicho esto, después y fuera del bucle, x == 1 también.

De hecho, Decimal x; en el ciclo es redundante, y tiene la misma lógica de ejecución que

 string s; Decimal x; for (int i = 1; i <= 10; i++) { s = i.ToString(); if(i == 1) { x = Decimal.Parse(s); } Console.WriteLine(x); } // x still defined here
over 4 years ago · Santiago Trujillo Relatório

0

Para darle algún sentido a lo que quieres, debería ser así:

 For i As Integer = 1 To 10 If i = 1 Then Console.WriteLine(Decimal.Parse(i.ToString())) End If Next

Esto le dará el mismo resultado que desea pero es legible.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda