REF (C# odniesienia)
ref Słowa kluczowego powoduje przekazanie przez odwołanie, nie przez wartość argumentu.Efekt przejścia przez odwołanie jest, że wszelkie zmiany parametrów w metodzie znajduje odzwierciedlenie w podstawowych zmiennej argument w metodzie wywołującego.Wartość parametru odniesienia jest zawsze taka sama jak wartość zmiennej argument podstawowej.
[!UWAGA]
Nie należy mylić koncepcji przechodzącej przez odwołanie z koncepcją typy odwołań.Oba pojęcia nie są takie same.Parametr metody mogą być modyfikowane przez ref niezależnie od tego, czy jest to typ wartości lub typem odwołania.Nie ma żadnych boksie typ wartości jest przekazywany przez odwołanie.
Aby użyć ref parametru, definicja metody i wywołanie metody muszą jawnie użyć ref słów kluczowych, jak pokazano w poniższym 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 musi zostać zainicjowany przed jego.To różni się od out parametry, których argumenty nie trzeba jawnie zainicjowane, zanim zostaną one przekazane.Aby uzyskać więcej informacji, zobacz się.
Elementy klasy nie może mieć podpisów, które różnią się tylko przez ref i out.Błąd kompilatora występuje, jeśli jedyna różnica między dwoma składnikami typu jest, że jeden z nich ma ref , a drugi parametr ma out parametru.Na przykład, poniższy 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że przeciążenia można zrobić podczas jednej metody ma ref lub out , a drugi parametr ma wartość parametru, jak pokazano w poniższym przykładzie.
class RefOverloadExample
{
public void SampleMethod(int i) { }
public void SampleMethod(ref int i) { }
}
W innych sytuacjach, które wymagają podpisu dopasowania, takie jak ukrywanie lub przesłanianie ref i out są częścią podpisu i nie pasują do siebie.
Właściwości nie są zmienne.Metody i nie mogą być przekazywane do ref parametry.
Informacje, jak przekazać tablic, zobacz Przekazywanie za pomocą tablic ref i out (C# Programming Guide).
Nie można użyć ref i out słów kluczowych dla następujących metod:
Metody komunikacji asynchronicznej, które można zdefiniować za pomocą asynchroniczne modyfikatora.
Metody iteracyjnej, które obejmują zwróceniu przekazu lub yield break instrukcji.
Przykład
W poprzednich przykładach pokazano, co się dzieje podczas przekazywania typów wartości przez odniesienie.Można również użyć ref słowo kluczowe, aby przekazać typów odwołań.Przekazując typ odwołania przez odwołanie umożliwia metodę o nazwie zmodyfikować obiekt, do którego odwołuje się parametr odniesienia.Lokalizacja przechowywania obiektu jest przekazywany do metody jako wartość parametru odniesienia.Zmiana lokalizacji przechowywania parametru zmiany lokalizacji przechowywania podstawowych argumentu.Poniższy przykład przekazuje wystąpienie typu odwołanie jako ref parametru.Aby uzyskać więcej informacji o tym, jak przekazać typów referencyjnych przez wartość i odniesienia, zobacz Przekazywanie parametrów typu odwołania (Podręcznik programowania 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 to najlepsze źródło informacji dotyczących składni i zastosowania języka C#.
Zobacz też
Informacje
Przekazywanie parametrów (Podręcznik programowania C#)
Parametry metody (C# odniesienia)