值类型和引用类型

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

原文地址:https://www.cnblogs.com/coolkiss/p/1797080.html