值类型和引用类型---深究

1,下面解释属于个人通俗理解版:

值类型:复制的过程只是复制副本,后面改变副本的值,不会对初始值产生影响。

引用类型:这里主要用类变量阐述,如果class var1=new class();和class var2=var1;都是引用的同一类对象var1,那么var2的值改变,var1也会改变。,

2,当值类型中包含引用类型时,依然存在值类型和引用类型的区分。

 class ShapeInfo                 //创建一个引用(类)类型
    {
        public string infoString;
        public ShapeInfo(string info)//带参数的构造函数
        {
            infoString = info;
        }
    }
    struct MyRectangle                     //创建一个值类型(结构类型)
    {
        public ShapeInfo rectInfo;
        public int top, left, right, bottom;
        public MyRectangle(string info)
        {
            rectInfo = new ShapeInfo(info);//实例化类类型
            top = left = 11;
            bottom = right = 110;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("创建第一个MyRectangle变量 r1");
            MyRectangle r1 = new MyRectangle("这是我创建的第一个MyRectangle对象");
            Console.WriteLine("现在将一个新的MyRectangle赋值给r1");
            MyRectangle r2 = r1;
            Console.WriteLine("改变r2的值");
            r2.rectInfo.infoString = "这是一个新的字符串信息";//改变类对象中的信息字符串值
            r2.bottom = 120;//改变结构类型中的bottom值
            Console.WriteLine("改变后的新值:");
            Console.WriteLine("->r1.rectInfo.infoString:{0}", r1.rectInfo.infoString);
            Console.WriteLine("->r2.rectInfo.infoString:{0}", r2.rectInfo.infoString);
            Console.WriteLine("->r1.botton:{0}", r1.bottom);
            Console.WriteLine("->r2.botton:{0}", r2.bottom);
            Console.ReadKey();
        }
    }

 3.按值类型传递引用类型。

  class MyInfo
    {
        public string MyName;//定义一个字符串类型变量存储用户姓名
        public int MyAge;//定义一个整数类型变量存储用户年龄
        public MyInfo(string name, int age)//创建一个带参数的构造函数
        {
            MyName = name;
            MyAge = age;
        }
        public MyInfo() { }//默认构造函数
        public void PrintInfo()//创建一个公有方法输出用户年龄信息
        {
            Console.WriteLine("{0}年龄是{1}岁", MyName, MyAge);
        }
    }
    class Program
    {
        public static void SendAPersonByValue(MyInfo info)
        {
            info.MyAge = 99;//改变‘info’的年龄
            info = new MyInfo("顾丽丽", 99);//这里info是不能被重新创建的,因为这个对象已经存在。
        }
        static void Main(string[] args)
        {//按值传递引用类型
            Console.WriteLine("输出用户年龄信息:");
            MyInfo fred = new MyInfo("房大伟", 29);
            Console.WriteLine("未改变用户信息前");
            fred.PrintInfo();
            SendAPersonByValue(fred);
            Console.WriteLine("改变后的用户年龄信息:");
            fred.PrintInfo();
            Console.ReadKey();
        }
    }

4,按引用传递引用类型。

 class MyInfo
    {
        public string MyName;//定义一个字符串类型变量存储用户姓名
        public int MyAge;//定义一个整数类型变量存储用户年龄
        public MyInfo(string name, int age)//创建一个带参数的构造函数
        {
            MyName = name;
            MyAge = age;
        }
        public MyInfo() { }//默认构造函数
        public void PrintInfo()//创建一个公有方法输出用户年龄信息
        {
            Console.WriteLine("{0}年龄是{1}岁", MyName, MyAge);
        }
    }
    class Program
    {
        public static void SendAPersonByValue(ref MyInfo info)
        {
            info.MyAge = 99;//改变'info'的值
            info = new MyInfo("顾丽丽", 25);//”info”现在指向了堆上的一个新对象,被改变。
        }
        static void Main(string[] args)
        {
            Console.WriteLine("输出用户年龄信息:");
            MyInfo fred = new MyInfo("房大伟", 29);
            Console.WriteLine("未改变用户信息前");
            fred.PrintInfo();
            SendAPersonByValue(ref fred);
            Console.WriteLine("改变后的用户年龄信息:");
            fred.PrintInfo();
            Console.ReadKey();
        }
    }

 

posted @ 2015-11-04 14:49  BetterCoder  阅读(185)  评论(0编辑  收藏  举报