adhishspn
adhishspn

Reputation: 97

List passed as reference

As list is of reference type, so why I am getting missionsList count as 0 instead of 4 in below example? Please explain this behaviour

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;
}

Upvotes: 0

Views: 99

Answers (2)

t3chb0t
t3chb0t

Reputation: 18744

To be able to return a new list via a method argument you have to use the out keyword:

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;
}

out (C# Reference)

What's the difference between the 'ref' and 'out' keywords?

Upvotes: 0

metacircle
metacircle

Reputation: 2588

Reference types are passed by value. Meaning you pass the address of the reference in a new variable (address gets copied to a new memory location, that one is passed).

In your submethod you are reassigning a new list to this new memory location, while the old memory location still holds the address of the original list.

See also: http://msdn.microsoft.com/en-us/library/s6938f28.aspx

What you should do is:

 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;
}

Upvotes: 2

Related Questions