Reputation: 97
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
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;
}
What's the difference between the 'ref' and 'out' keywords?
Upvotes: 0
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