Los objetos no se pasan en absoluto. Por defecto, el argumento se evalúa y su valor se pasa, por valor, como el valor inicial del parámetro del método al que está llamando. Ahora, el punto importante es que el valor es una referencia para los tipos de referencia, una forma de llegar a un objeto (o nulo). Los cambios a ese objeto serán visibles desde la persona que llama. Sin embargo, cambiar el valor del parámetro para referirse a un objeto diferente no será visible cuando use el valor de pasar por valor, que es el valor predeterminado para todos los tipos.
Si desea usar paso por referencia, debe usar out
o ref
, si el tipo de parámetro es un tipo de valor o un tipo de referencia. En ese caso, efectivamente la variable en sí se pasa por referencia, por lo que el parámetro usa la misma ubicación de almacenamiento que el argumento, y el llamante ve los cambios en el parámetro en sí.
Entonces:
public void Foo(Image image)
{
// This change won't be seen by the caller: it's changing the value
// of the parameter.
image = Image.FromStream(...);
}
public void Foo(ref Image image)
{
// This change *will* be seen by the caller: it's changing the value
// of the parameter, but we're using pass by reference
image = Image.FromStream(...);
}
public void Foo(Image image)
{
// This change *will* be seen by the caller: it's changing the data
// within the object that the parameter value refers to.
image.RotateFlip(...);
}
Tengo un artículo que entra en muchos más detalles en esto . Básicamente, "pasar por referencia" no significa lo que crees que significa.