一段看似簡單卻不簡單、老生常談的程式

來源:互聯網
上載者:User

一童鞋通過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.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.