应用场景:我有一个字典类型的变量,字典的value是list。我要将这个字典中的所有内容传入数据库交互层中的一个方法(InsertFunc)中,然后向数据库插入数据,同时还要每插入字典中的一个item就更新页面上的进度条。所以,我就只能每次只向InsertFunc传入字典的一个item,如果成功插入,就返回1,插入发生异常就返回0,这样的话,在页面层才可以进行进度条的控制。而且,如果要插入的数据主键已经在数据库存在时,要将数据库的数据赋值到这个字典item的value中,由于我们是将字典的每个item传入跨类的方法中来操作的,所以我想验证一下在这个InsertFunc方法中是否可以更改掉这个字典本身,所以做了一下demo。
①首先,我们看,在虚拟的页面层,我们是将三个行数据插入了字典集合中。
Dictionary<string, Student> students = new Dictionary<string, Student>();
students.Add("张三", new Student() { pim = new PIM() { Name = "张三", Old = 12, Sex = "女" } });
students.Add("李四", new Student() { pim = new PIM() { Name = "李四", Old = 13, Sex = "女" } });
students.Add("王五", new Student() { pim = new PIM() { Name = "王五", Old = 15, Sex = "女" } });
Console.WriteLine("初:");
foreach (var item in students)
{
Console.WriteLine(string.Format("姓名:{0},性别:{1},年龄:{2}", item.Value.pim.Name, item.Value.pim.Sex, item.Value.pim.Old));
}
Console.WriteLine("中:");
foreach (var item in students)
{
Operation.OperationFunc(item);
Console.WriteLine(string.Format("姓名:{0},性别:{1},年龄:{2}", item.Value.pim.Name, item.Value.pim.Sex, item.Value.pim.Old));
}
Console.WriteLine("后:");
foreach (var item in students)
{
Console.WriteLine(string.Format("姓名:{0},性别:{1},年龄:{2}", item.Value.pim.Name, item.Value.pim.Sex, item.Value.pim.Old));
}
Console.ReadKey();
②我们在虚拟的数据库交互层写一个方法,用来接收页面层传过来的字典item.
可以看到我们这个方法是跨项目的。
public class Operation
{
public static void OperationFunc(KeyValuePair<string,Student> student)
{
Student s = new Student();
s.pim.Name = "至高无上的三三";
s.pim.Sex = "男";
s.pim.Old = 25;
if (student.Key=="张三")
{
student.Value.pim = s.pim;
}
}
}
③这时,我们在虚拟的页面层来调用这个方法,试试最终的字典是否会被改变。
④打印效果
可以看到,我们在虚拟的数据库交互层中对字典子项的操作,最终会直接影响到这个字典本身。
总结:字典作为引用类型,它的子项中存的又是一个list,也是一个引用类型。当它的一个子项作为变量被传入方法InsertFunc中时,其实传过去的时候,传的是一个引用地址,最终改变的是这个引用地址所对应的值,而这个引用地址是不会发生改变的,除非进行了new()操作。