C# 作为引用传递的列表
因为列表是引用类型,所以为什么在下面的示例中,我将missionsList计数设为0而不是4? 请解释一下这种行为C# 作为引用传递的列表,c#,list,ienumerable,pass-by-reference,C#,List,Ienumerable,Pass By Reference,因为列表是引用类型,所以为什么在下面的示例中,我将missionsList计数设为0而不是4? 请解释一下这种行为 protected void AssignButton_Click(object sender, EventArgs e) { List<string> membersIdList = new List<string>(); List<Missions> missionsList = new List<Missions>
protected void AssignButton_Click(object sender, EventArgs e)
{
List<string> membersIdList = new List<string>();
List<Missions> missionsList = new List<Missions>();
string selectedMembersName = SelectedMembersDetailsGet(membersIdList, missionsList);
//Here membersIdList count is "1" & missionsList count is "0"
}
private string SelectedMembersDetailsGet(List<string> membersIdList, List<Missions> missionsList)
{
string selectedMembersName = string.Empty;
IEnumerable<Missions> commonMissionsList = null;
membersIdList.Add("XYZ");
commonMissionsList = MissionsGet(); //Returns 4 records
if (commonMissionsList != null)
{
missionsList = commonMissionsList.ToList();
}
return selectedMembersName;
}
protectedvoid AssignButton\u单击(对象发送方,事件参数e)
{
List membersIdList=新列表();
列表任务列表=新列表();
string selectedMembersName=SelectedMembersDetailsGet(成员列表、任务列表);
//此处membersIdList计数为“1”&任务列表计数为“0”
}
私有字符串SelectedMembersDetailsGet(列表成员列表、列表任务列表)
{
string selectedMembersName=string.Empty;
IEnumerable commonMissionsList=null;
成员列表。添加(“XYZ”);
CommonCommissionList=CommissionGet();//返回4条记录
if(commonMissionsList!=null)
{
missionsList=commonMissionsList.ToList();
}
返回selectedMembersName;
}
引用类型按值传递。这意味着您在一个新变量中传递引用的地址(地址被复制到一个新的内存位置,该位置被传递)
在您的子方法中,您正在将一个新列表重新分配给这个新的内存位置,而旧的内存位置仍然保留原始列表的地址
另见:
你应该做的是:
private string SelectedMembersDetailsGet(List<string> membersIdList, List<Missions> missionsList)
{
string selectedMembersName = string.Empty;
IEnumerable<Missions> commonMissionsList = null;
membersIdList.Add("XYZ");
commonMissionsList = MissionsGet(); //Returns 4 records
if (commonMissionsList != null)
{
foreach(var mission in commonMissionsList)
{
missionsList.Add(mission);
}
}
return selectedMembersName;
}
私有字符串SelectedMembersDetailsGet(列表成员列表,列表任务列表)
{
string selectedMembersName=string.Empty;
IEnumerable commonMissionsList=null;
成员列表。添加(“XYZ”);
CommonCommissionList=CommissionGet();//返回4条记录
if(commonMissionsList!=null)
{
foreach(普通任务列表中的var任务)
{
任务列表。添加(任务);
}
}
返回selectedMembersName;
}
要通过方法参数返回新列表,必须使用out
关键字:
protected void AssignButton_Click(object sender, EventArgs e)
{
List<string> membersIdList = new List<string>();
List<Missions> missionsList = null;
string selectedMembersName = SelectedMembersDetailsGet(membersIdList, out missionsList);
//Here membersIdList count is "1" & missionsList count is "0"
}
private string SelectedMembersDetailsGet(List<string> membersIdList, out List<Missions> missionsList)
{
string selectedMembersName = string.Empty;
IEnumerable<Missions> commonMissionsList = null;
membersIdList.Add("XYZ");
commonMissionsList = MissionsGet(); //Returns 4 records
if (commonMissionsList != null)
{
missionsList = commonMissionsList.ToList();
}
else
{
missionList = null; // You must assign to missionList otherwise the compiler will throw an error.
}
return selectedMembersName;
}
protectedvoid AssignButton\u单击(对象发送方,事件参数e)
{
List membersIdList=新列表();
列表任务列表=空;
string selectedMembersName=SelectedMembersDetailsGet(MembersId列表,out任务列表);
//此处membersIdList计数为“1”&任务列表计数为“0”
}
私有字符串SelectedMembersDetailsGet(列表成员SidList,输出列表任务列表)
{
string selectedMembersName=string.Empty;
IEnumerable commonMissionsList=null;
成员列表。添加(“XYZ”);
CommonCommissionList=CommissionGet();//返回4条记录
if(commonMissionsList!=null)
{
missionsList=commonMissionsList.ToList();
}
其他的
{
missionList=null;//必须分配给missionList,否则编译器将抛出错误。
}
返回selectedMembersName;
}
但是@metacircle的回答解释了为什么它的工作方式不是您期望的工作方式。感谢您的回答,但我确实知道ref&out的概念,只是急于了解指定的行为&“metacircle”的回答很好地解释了我要补充的一点,即所有参数在C#中默认按值传递,而不仅仅是引用类型。