C# 方法參數 ref 詳述
其實這個問題很容易理解,首先在C#中傳遞方法參數缺省是“值拷貝”模式,也就是說對於值類型(ValueType)變量直接拷貝一份,而對於引用類型則拷貝一個指向同一對象的引用副本傳遞給方法,因此即使不使用ref關鍵字,我們也可以在方法內部改變該引用所指向對象的內部狀態,但是某些時候我們需要在方法內部創建一個新的對象實例,並使得原有引用指向這個新的對象。那麼問題就來了,由於現在存在兩個引用,我們改變的隻是傳遞到方法的引用副本,而該副本在超出方法作用域後既失去作用,而原有的引用依然指向原有對象。因此我們需要使用ref關鍵字,那麼傳遞給方法的不再是引用副本,而是引用本身。我們就可以改變原有引用對象實例了。public class Data
{
public int i = 10;
}
public class Class1
{
public static void Test1(Data d)
{
// 參數d隻是一個引用副本,和原引用變量d同時指向同一個對象,因此都可以修改該對象的狀態。
d.i = 100;
}
public static void Test2(Data d)
{
// 創建新的Data對象,並將參數d指向它。此時參數d和原有引用d分別指向2個不同的Data對象,因此
// 當超出Test方法作用範圍時,參數d和其引用的對象將失去引用,等待GC回收。
d = new Data();
d.i = 200;
}
public static void Test3(ref Data d)
{
// 由於使用ref關鍵字,因此此處的參數d和原變量d為同一引用,並沒有創建副本,所以創建新的Data
// 對象是可行的。
d = new Data();
d.i = 300;
}
public static void Main(string[] args)
{
Data d = new Data();
Console.WriteLine(d.i); // 10
Test1(d);
Console.WriteLine(d.i); // 100
Test2(d);
Console.WriteLine(d.i); // 100
Test3(ref d);
Console.WriteLine(d.i); // 300
}
}
最後更新:2017-04-02 00:06:27
上一篇:
[.NET 基於角色安全性驗證] 之二:ASP.NET Forms 身份驗證流程分析
下一篇:
中文分詞組件
2016年10個重要的可視化發展
Picasso and Android-Universal-Image-Loader緩存框架
codeblocks 使用匯總
如何在線生成Word文檔?一種極簡,極強大的方法,支持圖片表格等各種格式
Chrome廣告插件暗藏挖礦代碼,可使電腦瞬間卡死
如果你想深刻理解ASP.NET Core請求處理管道,可以試著寫一個自定義的Server
Spark簡介及其在ubuntu下的安裝使用
The Linux Kernel Module Programming Guide
Android工作實踐總結:Aidl 遠程調用(aidl實例總結)
機器視覺檢測係統在軟包印刷中的應用