Předávání parametrů typu Reference (Příručka programování C#)
Proměnná Typ odkazu neobsahuje data přímo; obsahuje odkaz na data.Při předání parametru typ odkazu podle hodnoty, je možné změnit data odkazuje odkaz, například hodnota člena třídy.Nelze však změnit hodnotu odkaz sám; stejný odkaz, nelze použít k přidělení paměti pro nové třídy a jeho zachování mimo blok.K tomu je předat pomocí parametru ref nebo mimo klíčové slovo.Pro jednoduchost, použijte následující příklady ref.
Předávání typů referenční hodnotou
Následující příklad ukazuje předání parametru typ odkazu, arr, podle hodnoty metody, Change.Protože parametr je odkaz na arr, je možné změnit hodnoty prvků pole.Však pokus o opětovné přiřazení parametru umístění různých paměti pouze funguje uvnitř metody a neovlivní původní proměnné arr.
class PassingRefByVal
{
static void Change(int[] pArray)
{
pArray[0] = 888; // This change affects the original element.
pArray = new int[5] {-3, -1, -2, -3, -4}; // This change is local.
System.Console.WriteLine("Inside the method, the first element is: {0}", pArray[0]);
}
static void Main()
{
int[] arr = {1, 4, 5};
System.Console.WriteLine("Inside Main, before calling the method, the first element is: {0}", arr [0]);
Change(arr);
System.Console.WriteLine("Inside Main, after calling the method, the first element is: {0}", arr [0]);
}
}
/* Output:
Inside Main, before calling the method, the first element is: 1
Inside the method, the first element is: -3
Inside Main, after calling the method, the first element is: 888
*/
V předchozím příkladu pole, arr, který je typu odkazu je předán metodě bez ref parametr.V takovém případě kopie odkaz, který odkazuje na arr, je předán metodě.Výstup ukazuje, že je možné změnit obsah prvku pole v tomto případě z metody 1 na 888.Však přidělení nové části paměti pomocí nové operátor uvnitř Change metoda umožňuje proměnné pArray odkaz nové pole.Proto změny po neovlivní původní pole arr, který je vytvořen uvnitř Main.Ve skutečnosti jsou vytvořeny dvě pole, například jeden uvnitř Main a jeden Change metoda.
Typy odkazů předávání odkazem
Následující příklad je stejný jako v předchozím příkladu, že ref je klíčové slovo do záhlaví metoda a volání.Všechny změny, které se uskuteční v metodě ovlivnit původní proměnné volající aplikaci.
class PassingRefByRef
{
static void Change(ref int[] pArray)
{
// Both of the following changes will affect the original variables:
pArray[0] = 888;
pArray = new int[5] {-3, -1, -2, -3, -4};
System.Console.WriteLine("Inside the method, the first element is: {0}", pArray[0]);
}
static void Main()
{
int[] arr = {1, 4, 5};
System.Console.WriteLine("Inside Main, before calling the method, the first element is: {0}", arr[0]);
Change(ref arr);
System.Console.WriteLine("Inside Main, after calling the method, the first element is: {0}", arr[0]);
}
}
/* Output:
Inside Main, before calling the method, the first element is: 1
Inside the method, the first element is: -3
Inside Main, after calling the method, the first element is: -3
*/
Všechny změny, které se uskuteční v metodě ovlivnit původní pole v Main.Ve skutečnosti je původní matice přerozděleny pomocí new operátor.Tedy po volání Change metoda, jakýkoli odkaz na arr odkazuje na pět prvku pole, což je vytvořena v Change metoda.
Prohození dvou řetězců
Záměna řetězce je dobrým příkladem předávání parametrů typu odkazu reference.Příklad dvou řetězců str1 a str2, jsou inicializována v Main a předán SwapStrings metoda jako parametry změnil ref klíčové slovo.Dva řetězce jsou vyměnit uvnitř metody a uvnitř Main i.
class SwappingStrings
{
static void SwapStrings(ref string s1, ref string s2)
// The string parameter is passed by reference.
// Any changes on parameters will affect the original variables.
{
string temp = s1;
s1 = s2;
s2 = temp;
System.Console.WriteLine("Inside the method: {0} {1}", s1, s2);
}
static void Main()
{
string str1 = "John";
string str2 = "Smith";
System.Console.WriteLine("Inside Main, before swapping: {0} {1}", str1, str2);
SwapStrings(ref str1, ref str2); // Passing strings by reference
System.Console.WriteLine("Inside Main, after swapping: {0} {1}", str1, str2);
}
}
/* Output:
Inside Main, before swapping: John Smith
Inside the method: Smith John
Inside Main, after swapping: Smith John
*/
V tomto příkladu nutné parametry předávané odkazem vliv proměnné v volající program.Pokud odeberete ref klíčové slovo z metody záhlaví a volání metody, žádné změny bude probíhat v volající program.
Další informace o řetězcích řetězec.
Viz také
Referenční dokumentace
Předávání parametrů (Příručka programování C#)
Předávání pomocí pole ref a out (C# program televize)