zoukankan      html  css  js  c++  java
  • 值类型和引用类型

    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

  • 相关阅读:
    Linux下修改MySQL数据库字符编码为UTF-8解决中文乱码
    ODS与DW之间的关系
    如何使用Hive&R从Hadoop集群中提取数据进行分析
    CentOS6.5下实现R绘图
    Util.FSUtils: Waiting for dfs to exit safe mode
    Grafana邮件报警
    CentOS7安装Grafana(Yum)
    CentOS7安装Node_exporter(二进制)
    CentOS7安装Prometheus(二进制)
    linux查看进程内存占用
  • 原文地址:https://www.cnblogs.com/coolkiss/p/1797080.html
Copyright © 2011-2022 走看看