none
Que es mejor declarar variables dentro de un ciclo o fuera del el RRS feed

  • Pregunta

  • Buenas, tengo la siguiente consulta 

    ¿Para un  rendimiento mejor que se recomienda declarar variables dentro de un ciclo  o fuera de el  y sobre escribirlas?

    Ejemplo 1 variables fuera del ciclo 

    if (CboNumerosCliente.Items.Count > 0)
            {
              string numero= string.Empty;
              string oficina = string.Empty;
              var valor = new ListItem();
              foreach (var item in CboNumerosCliente.Items)
              {
                valor = item as ListItem;
                numero = valor.Value;
                if (!string.IsNullOrWhiteSpace(numero))
                {
                  oficina = numero.Substring(5, 3);
                  if (oficina.Equals("2000"))
                    CboNumerosCliente.Items.Remove(item.ToString());
                }
              }

    Ejemplo 2 variables declaradas dentro del ciclo.

              foreach (var item in CboNumerosCliente.Items)
              {
                 var  valor = item as ListItem;
                 string   numero = valor.Value;
                if (!string.IsNullOrWhiteSpace(numero))
                {
                   string  oficina = numero.Substring(5, 4);
                   if (oficina.Equals("2000"))
                    CboNumerosCliente.Items.Remove(item.ToString());
                }
              }

    miércoles, 24 de junio de 2020 16:15

Respuestas

  • hola

    Por lo general se recomienda definir las variables en el scope (ambito) en que vas a usarlas, mas que nada para evitar problemas de asignacion

    En los ejemplos que das es indistinto, pero queda claro que definirlas dentro queda el codigo mas prolijo, ademas no hace falta definirlas fuera cuando solo las vas usar dentro del foreach

    ademas puedes evitar algunas variables

    foreach (var item in CboNumerosCliente.Items)
    {
    	string numero = ((ListItem)item).Value;
    	if (!string.IsNullOrWhiteSpace(numero))
    	{
    	   string  oficina = numero.Substring(5, 4);
    	   if (oficina.Equals("2000"))
    		CboNumerosCliente.Items.Remove(item.ToString());
    	}
    }

    lo que estoy en duda es si usando un foreach puede eliminar item de la lista que estas iterando, estas seguro que el Remove() no genera ninguna problema con el foreach? yo diria que si, que debes usar una lista temporal donde agregues los items a eliminar y realice el remove en el segundo loop recorriendo esa lista

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta StevenCR27 miércoles, 24 de junio de 2020 21:53
    miércoles, 24 de junio de 2020 18:23

Todas las respuestas

  • En el caso de tu código no tiene mayor importancia si las declaras dentro o fuera de un ciclo, de hecho, los datos tipo string generan un nuevo objeto cada vez que le asignas un valor. La única y pequeña diferencia es que declaradas dentro del ciclo, cuando este finaliza, envía todos los datos al GarbageCollector.

    Para clases, estructuras y tipos de datos de alguna librería externa que tenga que tener datos sin valor asignado para cada ciclo, lo mejor es que la instancies en cada iteración del código. Si tiene que mantener la información guardada en todo el ámbito del ciclo y -además- tienes que consultar sus propiedades y valores, deberás declararla siempre fuera del ciclo.

    PD: Los objetos y variables que que declares e instancies dentro de un for, foreach, while, if-else etcéteram, sólo tienen alcance (visibilidad) dentro del propio proceso iterativo.

    Espero que te resulte de utlidad.

     

    miércoles, 24 de junio de 2020 17:28
  • hola

    Por lo general se recomienda definir las variables en el scope (ambito) en que vas a usarlas, mas que nada para evitar problemas de asignacion

    En los ejemplos que das es indistinto, pero queda claro que definirlas dentro queda el codigo mas prolijo, ademas no hace falta definirlas fuera cuando solo las vas usar dentro del foreach

    ademas puedes evitar algunas variables

    foreach (var item in CboNumerosCliente.Items)
    {
    	string numero = ((ListItem)item).Value;
    	if (!string.IsNullOrWhiteSpace(numero))
    	{
    	   string  oficina = numero.Substring(5, 4);
    	   if (oficina.Equals("2000"))
    		CboNumerosCliente.Items.Remove(item.ToString());
    	}
    }

    lo que estoy en duda es si usando un foreach puede eliminar item de la lista que estas iterando, estas seguro que el Remove() no genera ninguna problema con el foreach? yo diria que si, que debes usar una lista temporal donde agregues los items a eliminar y realice el remove en el segundo loop recorriendo esa lista

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta StevenCR27 miércoles, 24 de junio de 2020 21:53
    miércoles, 24 de junio de 2020 18:23
  • Hola StevenCR27

    Gracias por confirmar que se ha encontrado una solución a la consulta realizada. Debido a ello, este hilo será cerrado. 

    Si es necesario, por favor abra un nuevo hilo. 

    Cualquier duda referente a productos Microsoft, puedes consultarnos. Es un gusto informarte. 

    Gracias por usar los foros de MSDN. 

     

     Andres Aguilar

    ____________________________ 

      


    viernes, 26 de junio de 2020 13:13
    Moderador