2014-11-26 2 views
0

Как список ссылочного типа, так почему я получаю countList count как 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; 
} 

ответ

2

Ссылочные типы передаются по значению. Это означает, что вы передаете адрес ссылки в новой переменной (адрес будет скопирован в новую ячейку памяти, и тот будет передан).

В вашем субметоде вы переназначаете новый список в эту новую ячейку памяти, а в старой ячейке памяти по-прежнему хранится адрес исходного списка.

Смотрите также: http://msdn.microsoft.com/en-us/library/s6938f28.aspx

Что вы должны сделать, это:

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

Я бы добавил, что все параметры передаются по значению ** по умолчанию ** в C#, а не только для ссылочных типов. – rexcfnghk

0

Чтобы иметь возможность вернуть новый список с помощью аргумента метода вы должны использовать 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; 
} 

out (C# Reference)

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

+0

Но ответ @ metacircle объясняет, почему он работает не так, как вы ожидали, что он будет работать. – t3chb0t

+0

спасибо за ваш ответ, но я действительно знал концепцию ref & out, просто хотел узнать, какое поведение и ответ «metacircle» в значительной степени объясняют вещь – adhishspn

Смежные вопросы