傳遞實值類型的參數 (C# 程式設計手冊)
實值型別變數直接包含其資料,這點相對於參考型別變數包含其資料的參考。 傳值方式傳遞實值型別變數的方法,以表示該變數的複本傳遞給方法。 給參數的方法內發生的任何變更會對不會影響到原本的資料儲存在引數的變數。 如果您想要變更參數的值被呼叫的方法,您必須傳送它所參考,使用 ref 或出關鍵字。 為了簡化,下列範例使用 ref。
以傳值方式傳遞實值型別
下列範例說明以傳值方式傳遞實值型別。 變數 n 是以傳值方式傳遞到方法 SquareIt。 在方法中對參數的任何變更並不會影響到變數原本的值。
class PassingValByVal
{
static void SquareIt(int x)
// The parameter x is passed by value.
// Changes to x will not affect the original value of x.
{
x *= x;
System.Console.WriteLine("The value inside the method: {0}", x);
}
static void Main()
{
int n = 5;
System.Console.WriteLine("The value before calling the method: {0}", n);
SquareIt(n); // Passing the variable by value.
System.Console.WriteLine("The value after calling the method: {0}", n);
// Keep the console window open in debug mode.
System.Console.WriteLine("Press any key to exit.");
System.Console.ReadKey();
}
}
/* Output:
The value before calling the method: 5
The value inside the method: 25
The value after calling the method: 5
*/
將變數n實值型別。 它包含它的資料,值5。 在叫用 (Invoke) SquareIt 時,n 的內容便會複製到方法括號內的 x 參數。 在Main,然而,值n之後相同電話SquareIt發生之前的方法。 發生在方法內的變更只會影響區域變數x。
以傳遞參考的方式傳遞實值型別
下列範例等同於先前的範例中,不同之處在於引數傳遞為ref參數。 基礎的引數,值n,何時變更x方法中發生變更。
class PassingValByRef
{
static void SquareIt(ref int x)
// The parameter x is passed by reference.
// Changes to x will affect the original value of x.
{
x *= x;
System.Console.WriteLine("The value inside the method: {0}", x);
}
static void Main()
{
int n = 5;
System.Console.WriteLine("The value before calling the method: {0}", n);
SquareIt(ref n); // Passing the variable by reference.
System.Console.WriteLine("The value after calling the method: {0}", n);
// Keep the console window open in debug mode.
System.Console.WriteLine("Press any key to exit.");
System.Console.ReadKey();
}
}
/* Output:
The value before calling the method: 5
The value inside the method: 25
The value after calling the method: 25
*/
在本範例中,並非傳遞 n 的值;而是傳遞 n 的參考。 參數 x 不是 int,而是 int 的參考。在此情況下為 n 的參考。 因此,當x求取平方時的方法,什麼實際上就是x指的是, n。
交換實值型別
變更引數的值的常見例子為 swap 方法,其中您將兩個變數傳遞至方法,而此方法交換它們的內容。 您必須引數 swap 方法以傳址方式傳遞。 否則,您切換至方法中,參數的本機複本,並不會變更在呼叫的方法。 下列範例將交換的整數值。
static void SwapByRef(ref int x, ref int y)
{
int temp = x;
x = y;
y = temp;
}
當您呼叫SwapByRef方法中使用ref在呼叫時,如下列範例所示的關鍵字。
static void Main()
{
int i = 2, j = 3;
System.Console.WriteLine("i = {0} j = {1}" , i, j);
SwapByRef (ref i, ref j);
System.Console.WriteLine("i = {0} j = {1}" , i, j);
// Keep the console window open in debug mode.
System.Console.WriteLine("Press any key to exit.");
System.Console.ReadKey();
}
/* Output:
i = 2 j = 3
i = 3 j = 2
*/