list1与list2 引用的是同一个内存地址,你把list1  实例化一下,再把list2的值赋给list1

解决方案 »

  1.   

    不需要实例化,直接List<myClass> list1=list2即可
    即使先new过,重新赋值之后,之前new出来的对象也被释放了
      

  2.   

    public List<LoginUser> FilterUser(List<LoginUser> list)
            {
                List<LoginUser> filterdList = new List<LoginUser>();
                List<LoginUser> survivedList = new List<LoginUser>();
                foreach(var item in list)
                {
                    var dbItem = XXXmethod(item.UserID);
                    if (dbItem != null)
                    {
                        //数据库中存在,向过滤掉的集合中添加
                        filterdList.Add(dbItem);
                    }
                    else
                    {
                        //数据库中不存在,则保留
                        survivedList.Add(item);
                    }
                }
                list.Clear();
                list = survivedList;
                return filterdList;
            }我调用的时候
    var filterd = FilterUser(list); //list.Count()>0
    这步执行完之后,list是null 
      

  3.   


    public List<LoginUser> FilterUser(ref List<LoginUser> list){
      // todo:
    }
      

  4.   

    public List<LoginUser> FilterUser(List<LoginUser> list)
            {
                List<LoginUser> filterdList = new List<LoginUser>();
                List<LoginUser> survivedList = new List<LoginUser>();
                foreach(var item in list)
                {
                    var dbItem = XXXmethod(item.UserID);
                    if (dbItem != null)
                    {
                        //数据库中存在,向过滤掉的集合中添加
                        filterdList.Add(dbItem);
                    }
                    else
                    {
                        //数据库中不存在,则保留
                        survivedList.Add(item);
                    }
                }
                list.Clear();
                list = survivedList;
                return filterdList;
            }我调用的时候
    var filterd = FilterUser(list); //list.Count()>0
    这步执行完之后,list是null 单步跟踪一下看看怎么回事~~~
      

  5.   

    好像你想修改参数的值,加个ref试试:
    public List<LoginUser> FilterUser(ref List<LoginUser> list)
      

  6.   

    list是个引用类型,所以即使使用值传递(不加ref关键字),你对它操作,也会影响传递进来的变量
      

  7.   

    成功了 确实加了ref就行了但为什么会这样呢? List<myClass> 不是引用类型吗? (我现有的知识是值类型才用得到ref 或 out 啊)
      

  8.   


    我clear之后, 又紧接着对list进行了“赋值”了啊  list = survivedList;  为什么在外部调用的时候,clear就起作用了,而list = survivedList 就没效果呢
      

  9.   

    你对它操作clear,也会影响传递进来的变量,那么就会影响你前面的操作。
      

  10.   


    我clear之后, 又紧接着对list进行了“赋值”了啊  list = survivedList;  为什么在外部调用的时候,clear就起作用了,而list = survivedList 就没效果呢
    因为你使用了
    survivedList.Add(item);
    item是个引用类型,所以你执行list.clear()之后,survivedList也被清空了
      

  11.   

    还有,不加ref关键字的话,引用类型使用值传递,还想获取它的返回值,你就不能改变它的引用
    使用了=new或=survivedList之后,它的引用被改变了,新的引用不会影响传递进来的数组
    而clear是对它本身之前的引用进行操作,会影响传递进来的数组
      

  12.   

    了解指针的知识就明白了
    引用类型就相当于是指针在使用在你的代码中,list.Clear() 是操作的指针所指向的数据,所以链表被清空了
    然后,list1 = list2 是改变了指针本身的值,也就是说list1所代表的链表改变了,但是list1原来代表的链表并没有变
         static void Test(List<User> list)
            {
                //改变是指针所指向的数据
                //list[0].name = "111";
                //list[0] = new User("333"); 
                //list.Clear();            //改变的是指针本身的数据
                //list = new List<User>();
                //list.Add(new User("444"));
                //List<User> l = new List<User>();
                //l.Add(new User("555"));
                //list = l;
            }
      

  13.   

    假设这样一个函数  void Test(int* pInt)list.clear  性质相当于   *pInt = 0 list1 = list2     性质相当于 pInt = pInt2前者,都是改变的指针所指向的区域
    后者,都是改变的指针本身的值
      

  14.   

    ref 对于引用类型的作用去查下
    引用类型在一个方法中,有没有ref结果是否一致是要看实际的
      

  15.   

    引用类型理解的不够彻底
    List<LoginUser> list是引用类型,变量list存储在栈上,它引用堆上的地址
    list复制给另外一个List<>,是地址指向另一个List<>你把list清空,清空的是堆上的东东,指向这个地址的栈区变量引用到的都是空
      

  16.   

    public List<LoginUser> FilterUser(List<LoginUser> list)
            {
                List<LoginUser> filterdList = new List<LoginUser>();
                List<LoginUser> survivedList = new List<LoginUser>();
                foreach(var item in list)
                {
                    var dbItem = XXXmethod(item.UserID);
                    if (dbItem != null)
                    {
                        //数据库中存在,向过滤掉的集合中添加
                        filterdList.Add(dbItem);
                    }
                    else
                    {
                        //数据库中不存在,则保留
                        survivedList.Add(item);
                    }
                }
                list.Clear();
                list = survivedList;
                return filterdList;
            }我调用的时候
    var filterd = FilterUser(list); //list.Count()>0
    这步执行完之后,list是null 内存地址并没有改变,你调试的时候你可以看到,在函数内部          list = survivedList; 执行完成,list内存地址更改,出了函数之外内存地址是原来的
    你的代码不能这么写 要么加ref 要么list.Addange(survivedList)