ref (Справочник по C#)
Обновлен: Ноябрь 2007
Ключевое слово ref используется для передачи аргументов по ссылке. В результате все изменения параметра в методе будут отражены в переменной при передаче элемента управления обратно в вызывающий метод. Для работы с параметром ref определение метода м вызывающий метод должны явно использовать ключевое слово ref. Пример.
class RefExample
{
static void Method(ref int i)
{
i = 44;
}
static void Main()
{
int val = 0;
Method(ref val);
// val is now 44
}
}
Аргумент, передаваемый в параметр 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 может быть изменен сам объект.
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#:
5.1.5 Параметры ссылок
10.6.1.2 Параметры ссылок
См. также
Основные понятия
Руководство по программированию в C#
Ссылки
Передача параметров (Руководство по программированию в C#)
Параметры методов (Справочник по C#)