使用新的List <t>(list)</t>后,List仍然通过引用传递

时间:2013-10-31 14:24:18

标签: c# pass-by-reference

在我的控制器中,我从CSV中读取用户:

var users = Utilities.GetUsersFromCSV(path, userType, course);

这将读取CSV文件并使用它构造User个对象。一个可能相关的部分是创建密码:

public static List<User> GetUsersFromCSV(string filepath, string userType, Course course) {
    var users = new List<User>();
    var user = new User();
    GeneratePassword(ref user);
    return users;
}

private static void GeneratePassword(ref User user) {
    var size = Rand.Value.Next(0, 3) + 8;
    var sb = new StringBuilder();

    var shuffledlist = Chars.OrderBy(a => Guid.NewGuid()).ToList();

    for (var i = 0; i < size; i++) {
          sb.Append((char) shuffledlist[i]);
    }

    user.Password = sb.ToString();
}

从CSV文件创建用户后,我想将它们添加到数据库中,如下所示:

_userRepository.AddUsers(Utilities.HashPasswords(users));

哪个电话

public static List<User> HashPasswords(List<User> users) {
   var newList = new List<User>(users);
   foreach (var user in newList) {
        user.Password = CalculateSha1Hash(user.Password, user.Login);
   }

   return newList;
}

根据this回答,正在传输到存储库的用户列表现在应该包含散列密码,而我的控制器中的users列表仍应包含原始密码。但是,在调试过程中,我注意到HashPasswords也会影响users中的密码。

造成这种情况的原因是什么?

1 个答案:

答案 0 :(得分:4)

newList对象是浅层副本。我会在原始列表中使用Linq Select来创建深层副本。

newList = users.Select(u => CopyAndChangePassword(u));