Share via


ref (Referencia de C#)

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.

Nota

No confunda el concepto "pasar por referencia" con el concepto "tipos de referencia". Los dos conceptos no son iguales. ref puede modificar un parámetro de método sin tener en cuenta si es un tipo de valor o de referencia. No se produce la conversión boxing de un tipo de valor cuando se pasa por referencia.

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)
        {
            // Rest the mouse pointer over i to verify that it is an int.
            // The following statement would cause a compiler error if i
            // were boxed as an object.
            i = i + 44;
        }

        static void Main()
        {
            int val = 1;
            Method(ref val);
            Console.WriteLine(val);

            // Output: 45
        }
    }

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

Aunque las palabras clave out y ref generan un comportamiento diferente en tiempo de ejecución, no se consideran parte de la firma del método en tiempo de compilación. Por consiguiente, no se pueden sobrecargar los métodos si la única diferencia consiste en que un método toma un argumento ref y el otro toma un argumento out. Por ejemplo, el código siguiente 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. En realidad, son métodos, por lo que 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. Para obtener más información, vea Pasar parámetros Reference-Type (Guía de programación de C#).

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 la Especificación del lenguaje C#. La especificación del lenguaje es la fuente definitiva de la sintaxis y el uso de C#.

Vea también

Referencia

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

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

Palabras clave de C#

Conceptos

Guía de programación de C#

Otros recursos

Referencia de C#