一童鞋通過email向技術部發了個問題:
用C#時遇到如下問題,希望哪位高手幫忙解答一下:環境:VS2005/2008 //實體 [Serializable] public class TestModel { public int ID { set; get; } public string Name { set; get; } }//表單 public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { IList<TestModel> modelList = new List<TestModel>(); new Bridge().Test(modelList); int listCount = modelList.Count; } } //測試類別 public class Bridge { private readonly Test _dal = new Test(); public IList<TestModel> list = new List<TestModel>(); public void Test(IList<TestModel> modelList) { TestModel model = new TestModel(); list.Add(model); modelList = list; } } listCount 等於幾?為什麼?
想必有些童鞋也遇到過這個問題,尤其是在面試時,哈哈。
技術部大家火熱的聊起來,最後終於知其一二了。 真是看似簡單卻不簡單呀。
下面摘錄一位架構師給的建議:
C#中有兩種類型的資料,一種是實值型別,一種是參考型別
C#中傳遞方法參數, 預設是“值拷貝”模式,也就是說對於實值型別變數直接拷貝一份.
那對於函數
public void Increment( int i )
{
i++; //對於i的修改將是無效的,如需做真正的修改,需要藉助於ref關鍵字
}
傳遞方法參數,對於參考型別則拷貝一個指向同一對象的引用副本傳遞給方法,因此不使用ref,也能在方法內部改變該引用所指向對象的內部狀態。
但是某些時候我們需要在方法內部建立一個新的對象執行個體,並使得原有引用指向這個新的對象。那麼問題就來了,由於現在存在兩個引用,我們改變的只是傳遞到方法的引用副本,而該副本在超出方法範圍後既失去作用,而原有的引用依然指向原有對象。(modelList 依然為初始值的原因所在)
如想改變原有對像,需要使用ref.