• 值类型和引用类型


    c#类型分为值类型和引用类型

    值类型赋值或者传递时候,都会复制一分数据,所以改变新数据值的时候并不会改变原来数据

    而引用类型的赋值与传递时,C#会复制一份引用地址,因此改变新变量值时候,会影响到原来的变量

    测试如下代码:
     class Program
        {
            static void Main(string[] args)
            {
                Person p = new Person { Name = "Chris", Gender = "Male" };
                Person p1 = p;
            p = null;
                try
                {
                    Console.WriteLine(p1.Name);
                }
                catch(Exception ex)
                {
                    throw ex;
                }
                Console.Read();
            }

            private static void Change(Person p)
            {
                p = null;
                return;
            }
        }

        public class Person:Object
        {
            public Person()
            {}
            public string Name = "";
            public string Gender = "";

            public void getName()
            {
                return;
            }
        }

    最开始我以为会抛出“未将对象引用设置到对象实例”的异常,但是实际上并无异常,且输出“Chris”
    这里将p置为null,只是将p的地址设置为null,而其真实内容依然存在内存中,同时也存在p1对这些数据的引用。
    因此数据不会被释放,p1.Name还是“Chris”

    同样道理 将 p = null; 改成change(p1)传入时,会复制一份p1的地址,假设为p2,进入到change函数体后,将p2置为null,同样
    改变的只是p2的地址,而p1并不为空,如果要使p1为空,则可以在参数中加ref 或者out




    http://msdn.microsoft.com/en-us/library/ms229614.aspx

  • 相关阅读:
    【Git】时光机命令—Git命令
    【Vue.js】vue引入组件报错:该组件未注册?
    【CSS】flex布局初认识
    【Vue.js】基于vue的实时搜索,在结果中高亮显示关键词
    MyBatis介绍并解决jdbc编程的问题
    MyBatis中 #{} 和 ${}的区别
    Mybatis执行操作时控制台日志中显示sql语句
    Mybatis中常见操作(基本操作+动态sql+sql片段+关联映射(resultMap))
    Spring配置初始化和销毁的方法
    平时工作常用linux命令总结
  • 原文地址:https://www.cnblogs.com/coolkiss/p/1797080.html
Copyright © 2020-2023  润新知