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