Поделиться через


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 приводят к разным результатам во время выполнения, однако во время компиляции они не считаются частью сигнатуры метода. Поэтому, если единственное различие между методами заключается в том, что один метод принимает аргумент 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.

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

Пример

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

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

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

См. также

Ссылки

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

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

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

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

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

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

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