Voy a probar suerte con una explicación:
Creo que entendemos cómo funcionan los tipos de valor, ¿verdad? Los tipos de valor son (int, long, struct, etc.). Cuando los envía a una función sin un comando ref, COPIA los datos . Cualquier cosa que haga a esos datos en la función solo afecta a la copia, no al original. El comando ref envía los datos ACTUALES y cualquier cambio afectará los datos fuera de la función.
De acuerdo con la parte confusa, tipos de referencia:
Vamos a crear un tipo de referencia:
List<string> someobject = new List<string>()
Cuando renueva un objeto , se crean dos partes:
- El bloque de memoria que contiene datos para algún objeto .
- Una referencia (puntero) a ese bloque de datos.
Ahora, cuando envía algún objeto a un método sin referencia, COPIA el puntero de referencia , NO los datos. Entonces ahora tienes esto:
(outside method) reference1 => someobject
(inside method) reference2 => someobject
Dos referencias apuntando al mismo objeto. Si modifica una propiedad en algún objeto utilizando referencia2, afectará los mismos datos señalados por referencia1.
(inside method) reference2.Add("SomeString");
(outside method) reference1[0] == "SomeString" //this is true
Si anula la referencia2 o la señala a datos nuevos, no afectará la referencia1 ni la referencia de datos1 a la que apunta.
(inside method) reference2 = new List<string>();
(outside method) reference1 != null; reference1[0] == "SomeString" //this is true
The references are now pointing like this:
reference2 => new List<string>()
reference1 => someobject
¿Qué sucede cuando envía un objeto por referencia a un método? La referencia real a algún objeto se envía al método. Entonces ahora solo tiene una referencia a los datos:
(outside method) reference1 => someobject;
(inside method) reference1 => someobject;
Pero ¿qué significa esto? Actúa exactamente igual que enviar algún objeto, no por referencia, excepto por dos cosas principales:
1) Cuando anule la referencia dentro del método, anulará la que está fuera del método.
(inside method) reference1 = null;
(outside method) reference1 == null; //true
2) Ahora puede apuntar la referencia a una ubicación de datos completamente diferente y la referencia fuera de la función ahora apuntará a la nueva ubicación de datos.
(inside method) reference1 = new List<string>();
(outside method) reference1.Count == 0; //this is true
MyClass
que sería unclass
tipo, es decir, un tipo de referencia. En ese caso, el objeto que pasa puede ser modificado pormyFunction
incluso sinref
/out
palabra clave.myFunction
recibirá una nueva referencia que apunta al mismo objeto, y puede modificar ese mismo objeto todo lo que quiera. La diferenciaref
que haría la palabra clave sería quemyFunction
recibiera la misma referencia al mismo objeto. Eso sería importante solo simyFunction
cambiara la referencia para apuntar a otro objeto.