ref (Referencia de C#)

La palabra clave ref produce un argumento que se pasa por referencia, no por valor.El efecto de pasar por referencia es que cualquier cambio del parámetro en el método se refleja en la variable subyacente al argumento en el método de llamada.El valor de un parámetro de referencia es siempre igual al valor de la variable subyacente del argumento.

[!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 usar un parámetro ref , la definición de método y el método de llamada deben explícitamente utilizar la palabra clave ref , como se muestra en el ejemplo siguiente.

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

Un argumento que se pasa a un parámetro ref debe inicializar antes de que pase.Esto difiere de los parámetros out , cuyos argumentos no tienen que explícitamente inicializar antes de que se pasan.Para obtener más información, vea out.

Los miembros de una clase no pueden tener firmas que sólo difieren ref y out.Se produce un error del compilador si la única diferencia entre dos miembros de un tipo es que uno de ellos tiene un parámetro ref y otro tiene un parámetro out .El código siguiente, por ejemplo, no se compila.

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, la sobrecarga se puede hacer cuando un método tiene ref o parámetro out y el otro tiene un parámetro de valor, como se muestra en el ejemplo siguiente.

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

En otras situaciones que requieren la firma coincidente, por ejemplo ocultar o reemplazar, ref y out es parte de la firma y no coincide.

Las propiedades no son variables.Son métodos, y no se pueden pasar a los 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#).

No puede usar palabras clave ref y out para los siguientes tipos de métodos:

  • Métodos Async, que se define utilizando el modificador async .

  • Métodos de iterador, que incluyen una instrucción retorno de producción o yield break .

Ejemplo

Los ejemplos anteriores muestran qué ocurre cuando se pasa los tipos de valor por referencia.También puede utilizar la palabra clave ref para pasar tipos de referencia.Pasar un tipo de referencia por referencia permite al método denominado para modificar el objeto al que el parámetro de referencia consulta.La ubicación de almacenamiento del objeto se pasa al método como el valor del parámetro de referencia.Si cambia la ubicación de almacenamiento de parámetro, se cambia la ubicación de almacenamiento de argumento subyacente.El ejemplo siguiente se pasa una instancia de un tipo de referencia como parámetro ref .Para obtener más información sobre cómo pasar tipos de referencia por valor y por referencia, vea Pasar parámetros Reference-Type (Guía de programación de C#).

class RefExample2
{
    static void ChangeByReference(ref Product itemRef)
    {
        // The following line changes the address that is stored in  
        // parameter itemRef. Because itemRef is a ref parameter, the
        // address that is stored in variable item in Main also is changed.
        itemRef = new Product("Stapler", 99999);

        // You can change the value of one of the properties of
        // itemRef. The change happens to item in Main as well.
        itemRef.ItemID = 12345;
    }

    static void Main()
    {
        // Declare an instance of Product and display its initial values.
        Product item = new Product("Fasteners", 54321);
        System.Console.WriteLine("Original values in Main.  Name: {0}, ID: {1}\n",
            item.ItemName, item.ItemID);

        // Send item to ChangeByReference as a ref argument.
        ChangeByReference(ref item);
        System.Console.WriteLine("Back in Main.  Name: {0}, ID: {1}\n",
            item.ItemName, item.ItemID);
    }
}

class Product
{
    public Product(string name, int newID)
    {
        ItemName = name;
        ItemID = newID;
    }

    public string ItemName { get; set; }
    public int ItemID { get; set; }
}

// Output: 
//Original values in Main.  Name: Fasteners, ID: 54321

//Back in Main.  Name: Stapler, ID: 12345

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#