No puede almacenar referencias a las variables en .NET, punto. Puede almacenar referencias a objetos, pero no referencias a variables.
La razón es que si se le permitiera almacenar referencias a variables arbitrarias, entonces podría almacenar referencias a variables locales. Si puede almacenar referencias a variables locales, entonces el tiempo de ejecución no puede usar la optimización de almacenamiento de variables locales en el grupo de memoria de corta duración, es decir, la pila.
Ahora, incluso si pudiera hacer eso, la operación que está describiendo no es segura por un motivo diferente. Tiene una variable de campo (muy mal nombrado) "a" de tipo "referencia a variable de objeto" y una variable local (muy mal y de nombre confuso) "a" de tipo "referencia a variable int". Incluso si pudiera almacenar una referencia a una variable, no tiene sentido almacenar una referencia a una variable int en algo del tipo "referencia a la variable de objeto" porque esos dos tipos lógicamente no son compatibles. Las operaciones que puede realizar en ellos son diferentes; una referencia a una variable de objeto puede tener una cadena escrita en ella; una referencia a una variable int no puede.
Tal vez estoy entendiendo mal pero ¿una variable como el entero de arriba no se encajonaría en un objeto que luego podría almacenarse como referencia?
Usted está confundiendo las referencias a objetos con referencias a las variables . Es confuso que usemos la misma terminología para lo que en realidad son dos cosas diferentes.
Sí, el boxeo convierte un tipo de valor, como int, en un tipo de referencia, como objeto. Eso NO TIENE ABSOLUTAMENTE NADA QUE VER con referencias a variables.
Cuando hace una referencia a una variable, está creando un alias para esa variable. Cuando dice
void M(ref int y) { y = 123; }
...
int x = 0;
M(ref x);
está diciendo "xey son dos nombres diferentes para la misma variable".
Ahora, si lo que quieres hacer es representar la noción de "He capturado una variable y quiero ser capaz de leer y escribir que" a continuación, utilizar delegados:
class Ref<T>
{
private Func<T> getter;
private Action<T> setter;
public Ref(Func<T> getter, Action<T> setter)
{
this.getter = getter;
this.setter = setter;
}
public T Value
{
get { return getter(); }
set { setter(value); }
}
}
...
int abc = 123;
var refabc = new Ref<int>(()=>abc, x=>{abc=x;});
... now you can pass around refabc, store it in a field, and so on
refabc.Value = 456;
Console.WriteLine(abc); // 456
Console.WriteLine(refabc.Value); // 456
sentido?
Le recomiendo que lea sobre la diferencia entre "tipos de valores" y "tipos de referencia" en el CLR. –
Hay punteros en .NET pero no se atreve a usarlos para este LOL –
@JohnSaunders ¿Cuál es la diferencia entre [C# -language] y [C#]? ¿No son sinónimos? No lo entiendo –