REF (C#-Reference)
ref Klíčové slovo způsobí, že předání odkazem, nikoli hodnotu argumentu.Předání odkazem je, že parametr metody změny se projeví v podkladové proměnné argument ve volání metody.Hodnota parametru odkaz je vždy hodnotu proměnné základní argument.
[!POZNÁMKA]
Nezaměňujte pojem předání odkazem pojmu referenční typy.Dvě koncepce nejsou stejné.Parametr metody mohou být změněny pomocí ref bez ohledu na to, zda je typ hodnoty nebo odkazu.Je předána odkazem je žádné zabalení typu hodnoty.
Použití ref musí explicitně použít parametr definice metody a volání metody ref klíčové slovo, jak je znázorněno v následujícím příkladu.
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, který je předán ref parametr musí být inicializováno před předáním.Tím se liší od out parametry, jejichž argumenty nemusíte explicitně inicializovat dříve, než jsou předány.Další informace naleznete v podle.
Členy třídy nemůže mít podpisy, které se liší pouze ref a out.Chyba kompilátoru dochází, pokud je jediný rozdíl mezi dvěma členy typu, že jeden z nich má ref má parametr a druhý out parametr.Například následující kód nelze kompilovat.
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) { }
}
Však přetížení lze provést Pokud jedna metoda má ref nebo out parametr a druhý má hodnotu parametru, jak je znázorněno v následujícím příkladu.
class RefOverloadExample
{
public void SampleMethod(int i) { }
public void SampleMethod(ref int i) { }
}
V jiných situacích, které vyžadují odpovídající podpis jako skrytí nebo přepsání ref a out jsou součástí podpisu a vzájemně neodpovídají.
Vlastnosti jsou proměnné.Způsoby a nelze předat na ref parametry.
Informace o tom, jak předat pole naleznete v tématu Předávání pomocí pole ref a out (C# program televize).
Nelze použít ref a out klíčová slova pro následující druhy metod:
Asynchronní metody, které definují pomocí asynchronní modifikátor.
Iterační metody, které patří příkazu yield return nebo yield break prohlášení.
Příklad
Předchozí příklady ukazují, co se stane při předání odkazem hodnotové typy.Můžete také použít ref klíčové referenční typy.Předání odkazem typ odkazu umožňuje změnit objekt odkaz parametru volané metody.Umístění úložiště objektu je předán metodě jako hodnotu parametru odkazu.Pokud změníte umístění úložiště parametru, změnit umístění úložiště základní argument.Následující příklad předává instance typu, jako ref parametr.Další informace o tom, jak hodnotou tak odkazem předat referenční typy viz Předávání parametrů typu Reference (Příručka programování 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
Specifikace jazyka C#
Další informace naleznete v tématu Specifikace jazyka C#. Specifikace jazyka je úplným a rozhodujícím zdrojem pro syntaxi a použití jazyka C#.
Viz také
Referenční dokumentace
Předávání parametrů (Příručka programování C#)
Parametry metody (C#-Reference)