ref (referência de C#)

A palavra-chave de ref causa um argumento a ser passado por referência, não por valor.O efeito de passagem por referência é que qualquer alteração no parâmetro no método é refletida na variável subjacente o argumento o método de chamada.O valor de um parâmetro de referência é sempre o mesmo que o valor da variável subjacente ao argumento.

ObservaçãoObservação

Não confunda o conceito de passagem por referência com o conceito de tipos de referência.os dois conceitos não são os mesmos.Um parâmetro do método pode ser modificado por ref independentemente se é um tipo de valor ou tipo de referência.Não há nenhum boxing de um tipo de valor quando é passada por referência.

Para usar um parâmetro de ref , a definição do método e o método de chamada devem explicitamente usar a palavra-chave de ref , conforme mostrado no exemplo o seguir.

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

Um argumento que é passado em um parâmetro de ref deve ser inicializado antes de ser passado.Isso difere dos parâmetros de out , cujos argumentos não precisam ser explicitamente inicializados antes de serem passados.Para obter mais informações, consulte out.

Membros de uma classe não podem ter as assinaturas que diferem somente por ref e por out.Um erro do compilador ocorre se a única diferença entre dois membros de um tipo é que um de eles tem um parâmetro de ref e o outro tem um parâmetro de out .O código a seguir, por exemplo, não 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) { }
}

Em o entanto, sobrecarregar pode ser feito quando um método tem ref ou parâmetro de out e o outro tem um parâmetro de valor, conforme mostrado no exemplo o seguir.

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

Em outras situações que exigem a correspondência de assinatura, como ocultar ou substituir, ref e out é a parte da assinatura e se não corresponde.

as propriedades não são variáveis.São métodos, e não podem ser passados para os parâmetros de ref .

Para obter informações sobre como passar matrizes, consulte Passando Arrays usando ref e out (C# Programming Guide).

Você não pode usar as palavras-chave de ref e de out para os seguintes tipos de métodos:

  • métodos de Async, que você define usando o modificador de async .

  • Métodos de iterador, que inclui uma instrução de retorno de produzir ou de yield break .

Exemplo

Os exemplos anteriores demonstram o que acontece quando você passa tipos de valor por referência.Você também pode usar a palavra-chave de ref para passar tipos de referência.Passar um tipo de referência por referência permite que o método chamado para alterar o objeto que o parâmetro de referência se refere.O local de armazenamento do objeto é passado para o método como o valor do parâmetro de referência.Se você alterar o local de armazenamento de parâmetro, você alterar o local de armazenamento do argumento subjacente.O exemplo passa uma instância de um tipo de referência como um parâmetro de ref .Para obter mais informações sobre como passar tipos de referência por valor e por referência, consulte Passando parâmetros de tipo de referência (guia de programação do 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

Especificação da linguagem C#

Para obter mais informações, consulte Especificação de linguagem do C# A especificação da linguagem é a fonte definitiva para a sintaxe e o uso da linguagem C#.

Consulte também

Referência

Passando parâmetros (guia de programação do C#)

Parâmetros do método (referência de C#)

Palavras-chave C#

Conceitos

Guia de programação do C#

Outros recursos

Referência de C#