ref (odwołanie w C#)
ref Słowa kluczowego powoduje, że mają być przekazywane przez odwołanie, nie przez wartość argumentu.Przekazywanie przez odwołanie powoduje zmiany do parametru w metodzie dzwonić ilustruje wywołania metody.Na przykład jeśli wywołujący wyrażenia zmiennych lokalnych lub wyrażenie dostępu do elementu tablicy, a następnie wywołana metoda zastępuje obiekt, do którego odwołuje się parametr ref, następnie zmiennej lokalnej wywołującego lub elementu tablicy teraz odwoływać się do nowego obiektu.
[!UWAGA]
Nie należy mylić koncepcji przekazywanie przez odwołanie z pojęcia typów odniesienia.Dwa pojęcia nie są takie same.Parametr metody może być modyfikowany przez ref niezależnie od tego, czy jest to typ wartości lub typu odwołania.Nie ma żadnych bokserskie typu wartości przekazanej przez odwołanie.
Aby użyć ref jawnie muszą używać parametrów, definicji metody oraz wywołania metody ref słowo kluczowe, jak pokazano w następującym przykładzie.
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
}
}
Argument, który jest przekazywany do ref parametr należy zainicjować przed został przekazany.To różni się od out parametry, których argumenty nie trzeba jawnie można zainicjować, zanim zostaną one przekazane.Aby uzyskać więcej informacji, zobacz się.
Członkowie klasy nie mają podpisy, które różnią się tylko w programie ref i out.Błąd kompilatora występuje, jeśli jedyną różnicą między dwoma składnikami typu jest, że jedną z nich ma ref parametru, a druga ma out parametru.Na przykład następujący kod nie kompilacji.
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) { }
}
Jednak przeciążenie zrobić po jednej metody ref lub out parametru, a druga ma parametr wartość, jak pokazano w następującym przykładzie.
class RefOverloadExample
{
public void SampleMethod(int i) { }
public void SampleMethod(ref int i) { }
}
W innych sytuacjach wymagających podpisu dopasowanie, takich jak ukrywanie lub zastąpienie ref i out są częścią podpisu i nie pasują do siebie.
Właściwości nie są zmienne.Są one metody i nie mogą być przekazywane do ref parametrów.
Aby uzyskać informacje o sposobie przekazać tablice, zobacz Przekazywanie tablic za pomocą ref i out (Przewodnik programowania w języku C#).
Nie można użyć ref i out słowa kluczowe rodzaju następujących metod:
Asynchronicznej metody, które można zdefiniować przy użyciu asynchronicznego modyfikator.
Metody sterująca, które obejmują uzyskanie zwrotu lub yield break instrukcji.
Przykład
W poprzednich przykładach przedstawiono, co się stanie po typów wartości jest przekazywany za pomocą odwołania.Można również użyć ref słowo kluczowe do przekazania typy referencyjne.Przekazanie typu odwołania w odniesieniu włącza metodę dzwonić zastąpić obiekt w wywołania metody, do którego odwołuje się parametr odwołania.Lokalizacja magazynu obiektu jest przekazywany do metody jako wartość parametru odwołania.Wartość w lokalizacji magazynu parametru (wskaż polecenie Nowy obiekt), możesz również zmiana lokalizacji magazynu, do którego odwołuje się element wywołujący.W poniższym przykładzie przekazuje wystąpienia typu odwołania jako ref parametru.Aby uzyskać więcej informacji na temat przekazywania typów odniesienia według wartości i odwołania zobacz Przekazywanie parametrów typu odwołanie (Przewodnik programowania w języku 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
Specyfikacja języka C#
Aby uzyskać więcej informacji, zobacz Specyfikacja języka C#. Specyfikacja języka jest ostatecznym źródłem informacji o składni i użyciu języka C#.
Zobacz też
Informacje
Przekazywanie parametrów (Przewodnik programowania w języku C#)
Parametry metody (odwołanie w C#)
Koncepcje
Przewodnik programowania w języku C#