list1=list2,为什么list1的值不会改变 list1与list2 引用的是同一个内存地址,你把list1 实例化一下,再把list2的值赋给list1 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不需要实例化,直接List<myClass> list1=list2即可即使先new过,重新赋值之后,之前new出来的对象也被释放了 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 public List<LoginUser> FilterUser(ref List<LoginUser> list){ // todo:} 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 单步跟踪一下看看怎么回事~~~ 好像你想修改参数的值,加个ref试试:public List<LoginUser> FilterUser(ref List<LoginUser> list) list是个引用类型,所以即使使用值传递(不加ref关键字),你对它操作,也会影响传递进来的变量 成功了 确实加了ref就行了但为什么会这样呢? List<myClass> 不是引用类型吗? (我现有的知识是值类型才用得到ref 或 out 啊) 我clear之后, 又紧接着对list进行了“赋值”了啊 list = survivedList; 为什么在外部调用的时候,clear就起作用了,而list = survivedList 就没效果呢 你对它操作clear,也会影响传递进来的变量,那么就会影响你前面的操作。 我clear之后, 又紧接着对list进行了“赋值”了啊 list = survivedList; 为什么在外部调用的时候,clear就起作用了,而list = survivedList 就没效果呢因为你使用了survivedList.Add(item);item是个引用类型,所以你执行list.clear()之后,survivedList也被清空了 还有,不加ref关键字的话,引用类型使用值传递,还想获取它的返回值,你就不能改变它的引用使用了=new或=survivedList之后,它的引用被改变了,新的引用不会影响传递进来的数组而clear是对它本身之前的引用进行操作,会影响传递进来的数组 了解指针的知识就明白了引用类型就相当于是指针在使用在你的代码中,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; } 假设这样一个函数 void Test(int* pInt)list.clear 性质相当于 *pInt = 0 list1 = list2 性质相当于 pInt = pInt2前者,都是改变的指针所指向的区域后者,都是改变的指针本身的值 ref 对于引用类型的作用去查下引用类型在一个方法中,有没有ref结果是否一致是要看实际的 引用类型理解的不够彻底List<LoginUser> list是引用类型,变量list存储在栈上,它引用堆上的地址list复制给另外一个List<>,是地址指向另一个List<>你把list清空,清空的是堆上的东东,指向这个地址的栈区变量引用到的都是空 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) 如何实现勾选复选框后单选框就不能用了 ChechListBox 有关DropDownList控件。 如何组织团队开发的问题???? 请大虾们指点 高薪诚聘.net程序员4人 (东莞) 部署到IIS上的asp.net网站后台的json反序列化 求助~ C# OpenXml Word操作,着急呀!! C#与VB.net共同开发一个网站,是不是特麻烦? 问题 “注册表最大值太小”是怎么回事?怎么解决? 关于自动动态生成combox取值的问题 在线等!!!着急!!基础性问题
即使先new过,重新赋值之后,之前new出来的对象也被释放了
{
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
public List<LoginUser> FilterUser(ref List<LoginUser> list){
// todo:
}
{
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 单步跟踪一下看看怎么回事~~~
public List<LoginUser> FilterUser(ref List<LoginUser> list)
我clear之后, 又紧接着对list进行了“赋值”了啊 list = survivedList; 为什么在外部调用的时候,clear就起作用了,而list = survivedList 就没效果呢
我clear之后, 又紧接着对list进行了“赋值”了啊 list = survivedList; 为什么在外部调用的时候,clear就起作用了,而list = survivedList 就没效果呢
因为你使用了
survivedList.Add(item);
item是个引用类型,所以你执行list.clear()之后,survivedList也被清空了
使用了=new或=survivedList之后,它的引用被改变了,新的引用不会影响传递进来的数组
而clear是对它本身之前的引用进行操作,会影响传递进来的数组
引用类型就相当于是指针在使用在你的代码中,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;
}
后者,都是改变的指针本身的值
引用类型在一个方法中,有没有ref结果是否一致是要看实际的
List<LoginUser> list是引用类型,变量list存储在栈上,它引用堆上的地址
list复制给另外一个List<>,是地址指向另一个List<>你把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)