Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > .NET
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 17-01-2006
Avatar de sakuragi
sakuragi sakuragi is offline
Miembro
 
Registrado: Feb 2004
Ubicación: root
Posts: 1.435
Poder: 16
sakuragi Va por buen camino
Question Se puede pasar un objeto por valor? C#

hola que tal.

Se puede pasar un objeto por valor de alguna forma?

saludos

gracias
__________________
OpenSuse OpenOffice.org icomputo
Responder Con Cita
  #2  
Antiguo 17-01-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: Dec 2004
Ubicación: Alcobendas, Madrid, España
Posts: 12.654
Poder: 27
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Se puede pasar un objeto por valor de alguna forma?
Suponiendo que te refieras a que un determinado método cuente con un parámetro con el que pueda recibir un objeto, por defecto, en C#, el objeto se pasará por valor, tal como precisas. Para pasar un parámetro por referencia has de especificarlo, tanto en la cabecera del método como en la llamada al mismo, con la palabra clave "ref".

Lo que acaso esté ocurriéndote es que notes que pasas un objeto como parámetro de un método, varías alguna de sus propiedades en dicho método y, a continuación y fuera ya del método, ves que los valores de las propiedades que cambiaste en el método se mantienen, ¿me equivoco? Pero es que lo que pasas como parámetro cuando se trata de un tipo de objeto será siempre una referencia a dicho objeto, eso es lo que tienes en la variable que pasas como parámetro: una referencia a un objeto.

Es decir, si haces algo así:

Código:
    // Un objeto de ejemplo
    public class UnObjeto : Object
    {
      public string mCadena = string.Empty;
    }

    /* Un evento que aprovechamos para crear
       un objeto, darle un valor a su única
       variable y pasar dicho objeto como
       parámetro en la llamada a un método.
    */
    private void button1_Click(object sender, EventArgs e)
    {
      UnObjeto objeto = new UnObjeto();
      objeto.mCadena = "Un valor para mCadena";

      // En el siguiente mensaje se mostrará el mismo valor
      // tanto como resultado de "UnMetodo(objeto)" como en
      // "objeto.mCadena".

      MessageBox.Show(string.Format("{0} - {1}", 
        UnMetodo(objeto), objeto.mCadena));
    }

    /* Este método recibe el objeto por valor,
       pero, lo que recibe es una variable con
       la referencia a un objeto, con lo que si
       cambiamos el valor de la única variable
       de este objeto de ejemplo este valor se
       mantendrá aún fuera de este método, como
       puede comprobarse más arriba.
    */
    public string UnMetodo(UnObjeto objeto)
    {
      objeto.mCadena = "Nuevo valor de mCadena?";
      return objeto.mCadena;
    }
Pero, parece ser que los parámetros en C# siempre se pasan por valor. Esto se puede comprobar en el siguiente código:

Código:
    public class UnObjeto : Object
    {
      public string mCadena = string.Empty;
    }

    private void button1_Click(object sender, EventArgs e)
    {
      UnObjeto objeto = new UnObjeto();
      objeto.mCadena = "Un valor para mCadena";

      /* En este caso pasamos el valor (como por defecto se
         lleva a cabo siempre en C#) al método "UnMetodo" de
         la variable "mCadena" de "objeto".
         
         Quiere decirse que ahora sí podrá notarse cómo el
         cambio que se hace en dicha variable en el método
         "UnMetodo" no tiene efecto ninguno fuera del método.
         
         El siguiente mensaje mostrará en "{0}" "Nuevo valor
         de mCadena?", mientras que en "{1}" se mostrará tal
         como se espera "Un valor para mCadena", porque la
         propia variable "mCadena" no ha sido afectada en
         "UnMetodo".         
      */
      MessageBox.Show(string.Format("{0} - {1}", 
        UnMetodo(objeto.mCadena), objeto.mCadena));
    }

    public string UnMetodo(string cadena)
    {
      cadena = "Nuevo valor de mCadena?";
      return cadena;
    }
Si fuera menester pasar parámetros por referencia, como queda dicho, hay que anteponer la palabra "clave" "ref" tanto en la cabecera del método en cuestión como en la llamada al mismo, de este modo:

Código:
    public class UnObjeto : Object
    {
      public string mCadena = string.Empty;
    }

    private void button1_Click(object sender, EventArgs e)
    {
      UnObjeto objeto = new UnObjeto();
      objeto.mCadena = "Un valor para mCadena";

      /* 
        Ahora tanto en "{0}" como en "{1}" se mostrará el valor
        modificado de la variable "mCadena", puesto que aunque se
        modifique en el método "UnMetodo" a este se le pasa la
        variable "mCadena" por referencia y no por valor.
      */
      MessageBox.Show(string.Format("{0} - {1}", 
        UnMetodo(ref objeto.mCadena), objeto.mCadena));
    }

    public string UnMetodo(ref string cadena)
    {
      cadena = "Nuevo valor de mCadena?";
      return cadena;
    }
Lamento si te he liado más que otra cosa y el rollo este que acabo de soltar cuando el tema podría haberse resumido tal vez bastante. Si te queda alguna duda coméntala que aquí habrá quien sepa dar cabo a la misma.
__________________
David Esperalta
www.davidesperalta.com
Responder Con Cita
  #3  
Antiguo 18-01-2006
Avatar de sakuragi
sakuragi sakuragi is offline
Miembro
 
Registrado: Feb 2004
Ubicación: root
Posts: 1.435
Poder: 16
sakuragi Va por buen camino
de verdad muchas gracias por esmerarte en tan buena explicacion.

gracias

saludos
__________________
OpenSuse OpenOffice.org icomputo
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
¿Que es lo peor que te puede pasar? sanxpue Debates 14 27-05-2004 14:07:14
Fast Report: Ajustar tamaño objeto OLE kes Impresión 0 13-10-2003 10:59:18
Te puede pasar a ti... Investment Humor 4 11-09-2003 17:37:25
como se puede destruir un objeto en ejecucion o_rlando20 OOP 1 14-05-2003 03:23:32


La franja horaria es GMT +2. Ahora son las 17:06:05.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi