buguge - Keep it simple,stupid

知识就是力量,但更重要的,是运用知识的能力why buguge?

导航

一段看似简单却不简单、老生常谈的程序

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

posted on 2011-11-18 18:35  buguge  阅读(727)  评论(4编辑  收藏  举报