老調重彈:參數傳遞–傳遞參考型別

來源:互聯網
上載者:User

C#中實值型別和參考型別作為方法參數傳遞的時候其實都可以說是“值”的傳遞,只不過這裡的“值”指代的東西有所區別。

當方法的參數為實值型別時,方法傳遞的是值本身的值。

當方法的參數為參考型別時,方法傳遞的則是應用類型的引用的地址,也就是參考型別地址在棧上的值。

舉個參考型別作為參數傳遞的例子

代碼
 static void Main()
{
ArgsRef abf = new ArgsRef();
AddRef(abf);
Console.WriteLine(abf.i);
Console.Read();
}

private static void AddRef(ArgsRef abf)
{
//abf = new ArgsRef();
abf.i = 20;
Console.WriteLine(abf.i);
}


class ArgsRef
{
public int i = 10;
}

 

假設Main方法中ArgsRef abf=new ArgRef();中abf的堆棧地址為0x10;則在方法傳遞的過程中AddRef(abf);實際上是傳遞的一個地址指向,而這個地址指向也是原來地址的一個拷貝。
嚴格意義上也是“值”傳遞,類似於abf=0x10;
在把DEMO中的注釋去掉的情況下:進到方法AddRef中,如果又執行一次abf=new ArgsRef();此時則更改了abf的地址,將新的地址賦給了abf,假設是0x11。此時在方法體裡面
abf實際上是0x11指向的對象。而Main方法中Console.WriteLine(abf.i)中的abf的地址還是0x10,
因為方法傳遞引用參數的時候是傳遞的地址的拷貝,這一點和實值型別傳遞的時候傳遞值的一個拷貝是一致的。
所以:
上面的例子中,如果方法AddRef的第一行注釋掉的話,Main方法裡面輸出的結果是:20,20;如果把注釋去掉的話輸出的結果是:20,10

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.