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++;
}
}
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
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:
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++;
}
}
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
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. :(