ref para variables no parametros en funciones

Supongamos que tengo una clase de Person y tengo lo siguiente:

 Person A = new Person("Tom"); Person B = A; 

¿Hay alguna manera de cambiarlo de modo que si asigno una nueva Person a B , B = new Person("Harry") , A también se refiera a la misma instancia? Sé que puedes hacer eso en una asignación de parámetros ref en una función.

La función que desea se llama “ref locals” y no se admite en C #.

El CLR admite la generación de código que contiene ref refs locales, y hace unos años escribí una versión experimental de C # que tenía la característica que desea, solo para ver si funcionaría. Podrías hacer algo como:

 Person a = whatever; ref Person b = ref a; 

y luego, como usted dice, los cambios en “b” cambiarían el contenido de “a”. Las dos variables se convierten en alias para la misma ubicación de almacenamiento.

Aunque era una pequeña característica agradable y funcionaba bien, decidimos no usarla para C #. Es posible que aún pueda suceder en una hipotética versión futura del lenguaje, pero no me entusiasmaría mucho al respecto; probablemente no sucederá

(Recuerde, todas las reflexiones de Eric sobre las futuras versiones hipotéticas de cualquier producto de Microsoft son solo para fines de entretenimiento).

No, no es posible en el código seguro (más allá de los parámetros de la función ref ). En código inseguro, es posible que puedas usar punteros para lograrlo, pero no creo que sea una buena idea.

A contiene la referencia a “Tom” como un valor. Necesitaría una referencia a A para cambiar a donde apunta.

Si consideramos un código similar en un lenguaje que usa indicadores de forma explícita en lugar de tratar implícitamente las instancias de clases como referencias:

 Person* A=new Person("Tom"); Person* B=A; B=new Person("Harry");//Changes only B Person** C=&A; (*C)=new Person("John");//Now A changes 

Entonces necesitas un puntero a un puntero para cambiar A Si transfieres esto a C # necesitarás una referencia a una variable local. Y esos solo están disponibles en forma de parámetros de función ref . Esto evita algunos problemas de por vida, ya que una referencia a una variable local no puede sobrevivir a esa variable local de manera segura.

Si estas no son variables privadas, podrías hacer de B una propiedad que modifique A en el setter.

 Person B{get{return A;} set{A=value;}} 

No hay manera directa de hacer eso.

Puede tomar un enfoque de código fuente como:

 A = B = new Person("Harry") 

O utilice un tipo genérico. Algo como:

 var A = new ReferenceHolder (new Person("Tom")); var B = A; 

En C # también puede usar un puntero (básicamente un tipo de referencia) pero ese enfoque no es verificable estáticamente y no se sugiere.