valores valor usar tipo salida referencia reciben que programacion por paso pasar parametros parametro objetos metodos funciones como c# ref

c# - valor - ref para variables no parametros en funciones



pasar tipo como parametro c# (3)

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 locales de referencia, 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 versión hipotética del lenguaje en el futuro, 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).

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.


No hay una forma directa de hacerlo.

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<Person> (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.


No, no es posible en código seguro (más allá de los parámetros de la función de 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.

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;}}