• Domingo 22 de Diciembre de 2024, 19:17

Autor Tema:  Duda con parámetros por referencia  (Leído 2104 veces)

DanteInfernum666

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Duda con parámetros por referencia
« en: Miércoles 10 de Abril de 2013, 00:27 »
0
Leí por ahí que: "poner static antes del nombre de un método hace que todas las variables locales de ese método tengan clase de almacenamiento estático"

¿Un método NO estático que acepte parámetros por referencia es equivalente a un método ESTÁTICO que acepte parámetros por valor?
Equivalente en el sentido de modificar la variable original pasada como parámetro.

¡Saludos!

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re:Duda con parámetros por referencia
« Respuesta #1 en: Miércoles 10 de Abril de 2013, 06:26 »
0
Citar
¿Un método NO estático que acepte parámetros por referencia es equivalente a un método ESTÁTICO que acepte parámetros por valor?
Equivalente en el sentido de modificar la variable original pasada como parámetro.

No, no es equivalente, aunque un parametro se comporte como si fuera una variable local.

En una variable local estatica, se conserva el lugar de almacenamiento de la variable, conservando el valor entre llamadas, pero solo pueden modificarse dentro del metodo estatico, y los parametros por valor aunque el metodo sea estatico se siguen creando en la pila local del metodo, y por lo tanto su valor no se conserva.

En los parametros por referencia, las variables que se pasan como parametro se pueden modificar fuera del metodo, cosa que no pasa con las variables locales estaticas.

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

DanteInfernum666

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Re:Duda con parámetros por referencia
« Respuesta #2 en: Jueves 11 de Abril de 2013, 04:54 »
0
Sí, entiendo lo que decís. Es más, hice un par de ejemplos sencillos y llego a la misma conclusión.
Sin embargo, si tomás este otro ejemplo, ahí ya la cosa cambia:

Código: [Seleccionar]
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void ejemplo(int[] b)
        {
            b[0] = 999;
        }

        static void Main(string[] args)
        {
            int[] x = new int[1];
            x[0] = 0;
            ejemplo(x);
            Console.WriteLine(x[0]);

            Console.ReadKey();
        }
    }
}


Acá esperaba que el valor de x[0] continuara siendo 0, cosa que no fue así. El método "ejemplo" modifico el valor de la variable misma que le pasé como parámetro.
¿Tiene esto algo que ver con que esté trabajando con objetos? Capaz que los arreglos(o vectores) se comportan distinto en esta situación...

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re:Duda con parámetros por referencia
« Respuesta #3 en: Jueves 11 de Abril de 2013, 05:56 »
0
Citar
Capaz que los arreglos(o vectores) se comportan distinto en esta situación..

De hecho, haz dado en el clavo, los arreglos se comportan distinto que las variables normales.

En el caso que el parametro de una funcion sea un arreglo/vector, siempre seran parametros por refrerecia.

Esto comportamiento es heredado del lenguaje C/C++, y la razon es que no hay manera de saber cual es el tamaño del vector al pasar el parametro, entonces no es posible asignar espacio en la pila para almacenar el vector como en el caso de las variables que no son arreglos, y por lo tanto se le debe pasar la direccion (referencia) del vector.

Si pruebas lo siguiente:
Código: [Seleccionar]
using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace ConsoleApplication1
{
    public class Program
    {
        static void ejemplo(int b)
        {
            b = 999;
        }

        static void Main(string[] args)
        {
            int x;
            x = 0;
            ejemplo(x);
            Console.WriteLine(x);

            Console.ReadKey();
        }
    }
}

Veras que ahora si el valor de x no cambiara

Saludos :)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================