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

    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();
            }
        }
  • 相关阅读:
    c++单例设计模式---17
    c++友元函數---16
    c++const关键字---15
    c++浅拷贝和深拷贝---14
    linux shell 基本语法
    Linux静态库生成
    alsa wav
    Android Butterknife使用方法总结 IOC框架
    利用cglib给javabean动态添加属性,不用在建VO
    钢铁雄心三 通过事件做修改器
  • 原文地址:https://www.cnblogs.com/lilixiang-go/p/4935972.html
Copyright © 2011-2022 走看看