ref 和out的區(qū)別就不說(shuō)了,網(wǎng)上一搜,說(shuō)的都是這個(gè)。
我現(xiàn)在想說(shuō)一點(diǎn):很多人都說(shuō)ref對(duì)引用類型是沒(méi)有意義的。我覺(jué)得這句話完全是憑自己的想象說(shuō)出來(lái)的,都不去翻翻書。
MSDN原文是這么說(shuō)的 “按引用傳遞值類型(如上所示)是有用的,但是ref對(duì)于傳遞引用類型也是很有用的。這允許被調(diào)用的方法修改該引用所引用的對(duì)象,因?yàn)橐帽旧硎前匆脕?lái)傳遞的。下面的示例顯示出當(dāng)引用類型作為ref參數(shù)傳遞時(shí),可以更改對(duì)象本身。”
而他舉了個(gè)字符串的例子,個(gè)人覺(jué)得這個(gè)例子并不好,因?yàn)樽址旧硎且粋€(gè)比較特殊的引用類型,例子如下:
class RefRefExample{ static void Method(ref string s) { s = "changed"; } static void Main() { string str = "original"; Method(ref str); // str is now "changed" }}我也地ref的這一特征做了一個(gè)小測(cè)試,代碼如下PRotected void Page_Load(object sender, EventArgs e) { myclass myc = new myclass(); myc.Id = 1; myc.Name = "shit"; Response.Write(myc.Id + "<br>" + myc.Name + "<br>"); //沒(méi)有ref 原變量myc的引用對(duì)象不會(huì)改變 ModifyMyclass(myc); Response.Write(myc.Id + "<br>" + myc.Name + "<br>"); //有ref 原變量myc的引用對(duì)象改變了,引用了新對(duì)象 ModifyMyclass(ref myc); Response.Write(myc.Id + "<br>" + myc.Name + "<br>"); } private void ModifyMyclass( myclass myc) { myc = new myclass(); myc.Id = 23; myc.Name = "new myclass"; } private void ModifyMyclass(ref myclass myc) { myc = new myclass(); myc.Id = 23; myc.Name = "ref new myclass"; }
故意寫了一個(gè)myclass類作為參數(shù)傳遞
public class myclass{ private int id; public int Id { get { return id; } set { id = value; } } private string name; public string Name { get { return name; } set { name = value; } }}打印結(jié)果:
1shit1shit23ref new myclass
很顯然,ref對(duì)引用類型是有意義的。意義就在于變量本身能不能被改變。沒(méi)有ref的時(shí)候,變量本身是不會(huì)被改變的。只能改變變量引用的那個(gè)對(duì)象。而有了ref,變量本身是可以改變的,當(dāng)然變量引用的對(duì)象更是可以改變了。
所以,由此我也來(lái)想象一把:ref 標(biāo)記的參數(shù)傳遞過(guò)程中,沒(méi)有在棧中聲明新的變量,而傳遞的就是棧原來(lái)的變量本身。不知道這樣理解是否正確,還忘高手門深入剖析!
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注