ref
通常我們向方法中傳遞的是值方法獲得的是這些值的一個拷貝然後使用這些拷貝當方法運行完畢後這些拷貝將被丟棄而原來的值不將受到影響此外我們還有其他向方法傳遞參數的形式引用(ref)和輸出(out)
有時我們需要改變原來變量中的值這時我們可以向方法傳遞變量的引用而不是變量的值引用是一個變量他可以訪問原來變量的值修改引用將修改原來變量的值變量的值存儲在內存中可以創建一個引用他指向變量在內存中的位置當引用被修改時修改的是內存中的值因此變量的值可以將被修改當我們調用一個含有引用參數的方法時方法中的參數將指向被傳遞給方法的相應變量因此我們會明白為什麼當修改參數變量的修改也將導致原來變量的值
創建參數按引用傳遞的方法需使用關鍵字ref例;
using System;
class gump
{
public double square(ref double x)
{
x=x*x;
return x;
}
}
class TestApp
{
public static void Main()
{
gump doit=new gump();
double a=;
double b=;
ConsoleWriteLine(\Before square>a={}b={}\ab);
b=doitsquare(ref a);
ConsoleWriteLine(\After square>a={}b={}\ab);
}
}
通過測試我們發現a的值已經被修改為了
out
通過指定返回類型可以從方法返回一個值有時候(也許還沒遇到但是我們應該有這麼個方法)需要返回多個值雖然我們可以使用ref來完成但是C#專門提供了一個屬性類型關鍵字為out介紹完後我們將說明ref和out的區別
通過使用out關鍵字我們改變了三個變量的值也就是說out是從方法中傳出值
using System;
class gump
{
public void math_routines(double xout double halfout double squaredout double cubed)
//可以是:public void math_routines(//ref double xout double halfout double squaredout double cubed)
//但是不可以這樣:public void math_routines(out double xout double halfout double squaredout double cubed)對本例來說因為輸出的值要靠x賦值所以x不能再為輸出值
{
half=x/;
squared=x*x;
cubed=x*x*x;
}
}
class TestApp
{
public static void Main()
{
gump doit=new gump();
double x=;
double half=;
double squared=;
double cubed=;
[Page]
/*
double x=;
double half;
double squared;
double cubed;
*/
ConsoleWriteLine(\Before method>x={}\x);
ConsoleWriteLine(\half={}\half); ConsoleWriteLine(\squared={}\squared);
ConsoleWriteLine(\cubed={}\cubed);
doitmath_rountines(xout halfout squaredout cubed);
ConsoleWriteLine(\After method>x={}\x);
ConsoleWriteLine(\half={}\half);
ConsoleWriteLine(\squared={}\squared);
ConsoleWriteLine(\cubed={}\cubed);
}
}
我們發現ref和out似乎可以實現相同的功能因為都可以改變傳遞到方法中的變量的值但是二者本質本質的區別就是ref是傳入值out是傳出值在含有out關鍵字的方法中變量必須由方法參數中不含out(可以是ref)的變量賦值或者由全局(即方法可以使用的該方法外部變量)變量賦值out的宗旨是保證每一個傳出變量都必須被賦值
上面代碼中被/**/注釋掉的部分可以直接使用也就是說在調用方法前可以不初始化變量但是\x\是要賦值的否則要報錯而ref參數在傳遞給方法時就已經是還有值的了所以ref側重修改out側重輸出
From:http://tw.wingwit.com/Article/program/net/201311/15302.html