Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 作为引用传递的列表_C#_List_Ienumerable_Pass By Reference - Fatal编程技术网

C# 作为引用传递的列表

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>

因为列表是引用类型,所以为什么在下面的示例中,我将missionsList计数设为0而不是4? 请解释一下这种行为

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#中默认按值传递,而不仅仅是引用类型。