日期:2014-05-17  浏览次数:20999 次

List类型参数是值传递还是引用传递?
List类型参数是值传递还是引用传递?


 private void xxx(ref List<string> entryResults)
        {
            List<string[]> dateList = entryResults.Where(o=>o!=null).Select<string, string[]>(o => { return o.Split(new char[] { '/' }); }).ToList();
            //.......
            //根据逻辑修改dateList 中的值
           //....
            entryResults = dateList.Select<string[], string>(o => string.Join("/", o)).ToList();                
        }

public void yyy()
{
     List<string> entryResults = getList();
     completeDate(ref entryResults);    
}


在yyy中调用xxx方法或,entryResults的值并没有改变,好像List类型参数是值传递。

别说要加ref,我知道加了ref肯定好用。

------解决方案--------------------
楼主需要搞清楚对象和引用的区别和概念

引用本身是类似于一个“保存地址的值变量”
所以从方法外部传入引用到方法里,那么其实引用本身是复制了一份副本来给方法里使用的,只是说这个复制的引用副本和之前的引用的内容(也就是所指向的对象内存地址)是一样的,所以通过引用操作对象的数据时,可以看到2个引用都操作的同一个对象;但如果你是修改了引用副本本身的值内容(将该引用指向了一个新的对象的内存地址),那么是不会影响到之前方法外的那个引用的,所以修改后会发现2个引用所指向的对象不同了

而如果对象引用参数前加上了ref,那么方法参数所传递的不再是引用的副本,而是引用的地址了(即通过引用的地址找到引用,再读出引用里保存的内存地址值,再根据则个地址值去找到真正要操作的对象),所以如果此时你再修改这个引用的值时,会根据引用的地址找到方法外的那个引用,然后修改其内容,所以会发现方法外的引用也会指向新的对象了