ref (Справочник по C#)

Ключевое слово ref вызывает аргумента по по ссылке, а не по значению.Эффект передача по ссылке, что автоматически устанавливатьо любое изменение параметра в переменной в методе базового аргумента в вызывающем методе.Значение ссылочного параметра всегда совпадает со значением переменной базового аргумента.

ПримечаниеПримечание

Не следует путать понятие передачи по ссылке с понятием ссылочных типов.Эти две концепции не являются одинаковыми.Параметр метода может быть изменен с помощью модификатора ref независимо от того, принадлежит ли он к типу значения или ссылочному типу.При передаче по ссылке упаковка-преобразование типа значения не производится.

Для использования параметра ref и определение метода и при вызове метода должны явно использовать ключевое слово ref, как показано в следующем примере.

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

Аргумент, передаваемый в параметр ref должны быть инициализированы, прежде чем он передан.Это отличается от параметров out, аргументы, которые не должны быть явно инициализированы, прежде чем они передаются.Дополнительные сведения см. в разделе out.

Члены класса не могут иметь подписи, отличающиеся только ref и out.Ошибка компилятора возникает, когда единственное различие между 2 членам типа, что один из них имеет другой параметр ref и имеет параметр out.Например, следующий код не будет компилироваться.

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

Однако перегружать может быть выполнена, если один метод имеет ref или параметр out и другое имеет параметр значения, как показано в следующем примере.

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

В других ситуациях, требующих подпись соответствующий, как скрывать или переопределить, ref и out частью сигнатуры и не соответствуют друг другу.

Свойства не являются переменными.Эти методы и не могут быть переданы параметрам ref.

Дополнительные сведения о передаче массивов см. в разделе Передача массивов при помощи параметров ref и out (Руководство по программированию на C#).

Нельзя использовать ключевые слова ref и out для следующих типов методов:

  • Методы Async, которые можно указать с помощью модификатора async.

  • Методы итератора, которые включают формулировку получение выходных данных или yield break.

Пример

В предыдущих примерах показано, что происходит при передаче типы значений по ссылке.Можно также использовать ключевое слово ref чтобы передавать ссылочные типы.Передача по ссылке позволяет ссылочный тип с именем метод для изменения объекта, к которому относится ссылочный параметр.Место хранения объекта передается методу в качестве значения ссылочного параметра.Если изменить место хранения параметра, то необходимо изменить место хранения базового аргумента.В следующем примере передает экземпляр ссылочного типа, что и параметр ref.Дополнительные сведения о том, как передавать ссылочные типы по значению и по ссылке см. в разделе Передача параметров ссылочного типа (Руководство по программированию в 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

Спецификация языка C#

Дополнительные сведения см в Спецификация языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.

См. также

Ссылки

Передача параметров (Руководство по программированию в C#)

Параметры методов (Справочник по C#)

Ключевые слова C#

Основные понятия

Руководство по программированию на C#

Другие ресурсы

Справочник по C#