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#