关于C#引用类型值作为参数传递时是否可被更改

应用场景:我有一个字典类型的变量,字典的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()操作。

猜你喜欢

转载自blog.csdn.net/weixin_45963929/article/details/124709032
今日推荐