Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: Helius en 20 de Agosto de 2005, 03:43:07 PM

Título: Duda De C#
Publicado por: Helius en 20 de Agosto de 2005, 03:43:07 PM
 Necesito tener en una clase una referencia a un entero (o lo que sea) que pertenece a otra clase.

Me explico, quiero hacer que cuando se cree la instancia de una clase A se le pase por el constructor una referencia a un entero, que podría ser de una clase B, y la guarde como miembro para poder acceder a ella luego. Necesito que cuando se cambie el valor en B, la clase A acceda al valor actualizado claro.

Esto es muy fácil hacerlo en C++ pero no consigo hacerlo en C#  :(

Ahora mismo tengo esto pero no me funciona, si cambio el valor en B se queda el viejo en A:

class A
{
   Object referencia;

   A(Object r)
   {
       referencia = r;
   }

   AccederReferencia()
   {
       int entero = (int) referencia;
   }
}

class B
{
   int entero = 10;

   MiFuncion()
   {
       new A(entero);
       entero++;
   }
}

       
Título: Duda De C#
Publicado por: zupervaca en 20 de Agosto de 2005, 04:07:20 PM
 public class A
{
public A(ref Object dato)
{
this.dato = dato;
}
public Object dato;
}

El ref te sirve para asegurar que se pasa por referencia, ya que los tipos de datos basicos o estructuras se copian, si es una clase deberia de funcionarte siempre incluso sin el ref, no obstante en c# es aconsejable usar templates para estos casos, eso si he entendido tu problema

saludos

editado: viendo el post de Warchief ahora entiendo tu problema correctamente, efectivamente debes de crear una clase en la que metas en entero, haz esto solo si es un tipo de dato basico o una estructura
Título: Duda De C#
Publicado por: Warchief en 20 de Agosto de 2005, 04:11:31 PM
 Hace mucho que trabajé con C# y no recuerdo bien, pero ¿no faltaría una clase que encapsule al entero?


class MiEntero
{
  int valor;
}


Siendo entonces:


class A
{
 MiEntero ref;

 A(MiEntero r)
 {
     ref = r;
 }

 Acceso()
 {
     int valor = ref.valor;
  }
}



Creo que en java lo hacía así.  :unsure:  
Título: Duda De C#
Publicado por: Helius en 20 de Agosto de 2005, 04:19:24 PM
 Se supone que haciendo boxing y unboxing no es necesario clases que encapsulen a un entero ¿no?

Mi problema es que para más complicación la clasa A debe ser genérica y no tiene porque aceptar precisamente enteros, debería poder aceptar cualquier cosa...

Edito:

Debería ser exáctamente así:

class A <T>
{
  Object referencia;

  A(Object r)
  {
      referencia = r;
  }

  AccederReferencia()
  {
      T dato= (T) referencia;
  }
}

class B
{
  int entero = 10;

  MiFuncion()
  {
      new A<int>(entero);
      entero++;
  }
}
Título: Duda De C#
Publicado por: zupervaca en 20 de Agosto de 2005, 04:51:18 PM
 el boxing y el unboxing precisamente crea objetos envoltorio en TIEMPO DE EJECUCION con lo que sera mas lento que si lo haces tu a mano

saludos
Título: Duda De C#
Publicado por: Helius en 20 de Agosto de 2005, 05:01:13 PM
 Oopss, pero acabo de leer aquí http://www.codeproject.com/csharp/boxing.asp que el boxing crea una COPIA del valor de la variable que empaqueta y la pasa al heap, por eso no me funciona...

Parece que no se puede obtener de ninguna manera un dirección a una variable normal o un struct... Creo que no me queda más remedio que hacerme las clases envoltorio.  :(