ref (Referencia de C#)

Actualización: noviembre 2007

La palabra clave ref produce argumentos que se van a pasar por referencia. El efecto es que cualquier cambio que se realice en el parámetro dentro del método se reflejará en esa variable cuando se devuelva el control al método de llamada. Para utilizar un parámetro ref, la definición de método y el método de llamada deben utilizar explícitamente la palabra clave ref. Por ejemplo:

class RefExample
{
    static void Method(ref int i)
    {
        i = 44;
    }
    static void Main()
    {
        int val = 0;
        Method(ref val);
        // val is now 44
    }
}

Para pasar un argumento a un parámetro ref, primero debe inicializarse. Esto es diferente de out, cuyo argumento no tiene que inicializarse explícitamente antes de pasarlo. Para obtener más información, vea out.

Aunque ref y out se tratan de manera diferente en tiempo de ejecución, en tiempo de compilación se tratan de la misma manera. Por consiguiente, no se pueden sobrecargar los métodos si un método toma un argumento ref y el otro toma un argumento out. Por ejemplo, estos dos métodos son idénticos en lo referente a la compilación, por lo que este código no se compilará:

class CS0663_Example
{
    // Compiler error CS0663: "Cannot define overloaded 
    // methods that differ only on ref and out".
    public void SampleMethod(out int i) { }
    public void SampleMethod(ref int i) { }
}

Sin embargo, se puede realizar la sobrecarga si un método toma un argumento ref u out y el otro no utiliza ninguno de los dos, como en el ejemplo siguiente:

class RefOverloadExample
{
    public void SampleMethod(int i) { }
    public void SampleMethod(ref int i) { }
}

Las propiedades no son variables y, por consiguiente, no se pueden pasar como parámetros ref.

Para obtener información sobre cómo pasar matrices, vea Pasar matrices mediante Ref y Out (Guía de programación de C#).

Ejemplo

Como se mostró anteriormente en este tema, el paso de tipos de valor por referencia es útil, pero ref también es útil para pasar tipos de referencia. Esto permite a los métodos llamados modificar el objeto al que se refiere la referencia porque la propia referencia se pasa por referencia. El ejemplo siguiente muestra que cuando un tipo de referencia se pasa como parámetro ref, se puede cambiar el objeto mismo.

class RefExample2
{
    static void Method(ref string s)
    {
        s = "changed";
    }
    static void Main()
    {
        string str = "original";
        Method(ref str);
        Console.WriteLine(str);
    }
}
// Output: changed

Especificación del lenguaje C#

Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.

  • 5.1.5 Parámetros de referencia

  • 10.6.1.2 Parámetros de referencia

Vea también

Conceptos

Guía de programación de C#

Referencia

Pasar parámetros (Guía de programación de C#)

Parámetros de métodos (Referencia de C#)

Palabras clave de C#

Otros recursos

Referencia de C#