当前位置:首页 > C#学习 > 正文内容

对象的引用

小道6年前 (2018-08-20)C#学习4663

int、decimal、bool、byte等基础类型(值类型)是传递拷贝;对象(引用类型)则是传递引用。(引用类型包括:类、数组、接口、string)因为基础类型不怎么占内存,而对象则比较占内存。

    class Program
    {
        static void Main(string[] args)
        {
            int i = 10;//定义一个整型变量
            int j = i;//将i的数据拷贝给j。
            i++;//i的内容修改,但j的内容不变,
            Console.WriteLine("输出j的值:{0}",j);//结果是10.
            //int、datetime、bool、char 等类型都属于值类型(ValueType),赋值的时候是传递拷贝。  (原数据修改后,拷贝的不变。)

            //普通的对象则是引用类型,赋值的时候是传递引用。(原数据修改后,则所有引用他的对象 都改变了。)

            Person p1 = new Person(10);// 构造函数 要传递一个值。
            Person p2 = p1;//不是将P1数据拷贝给P2,而是  P1、P2指向相同的内容,内容修改后,P1和P2结果都改变,
            p1.Age++;//虽然修改的是 p1 数据,但是 p2指向的数据也是相同的。
            Console.WriteLine("输出p2.Age的值:{0}", p2.Age);//所以p2结果也是11.

            IncAge(p2);//调用函数 也是引用,不是拷贝。
            Console.WriteLine("输出p2.Age的值:{0}", p2.Age); //修改p指向的内容,虽然没返回值。但是  P1 P2 P指向相同的内容, P修改内容后,所以结果是12.

            Console.ReadKey();//按任意键退出
        }
        static void IncAge(Person p)//将p2指向的内容 同时给P指向。 不是拷贝。
        {
            p.Age++;//修改p指向的内容,虽然没返回值。但是  P1 P2 P指向相同的内容, P修改内容后,所以结果是12.
        }
    }
    class Person
    {
        public int Age { get; set; }//定义一个全局 属性.
        public Person(int age)//构造函数
        {
            this.Age = age;//将接收的值 赋值给 Age 属性.
        }
    }

输出结果:

image.png


关于string是引用类型:

String类型直接继承自Object,这使得它成为一个引用类型,也就是说线程上的堆栈上不会驻留有任何字符串。

String被分配在堆上,而不是栈上。因此,当把一个字符串变量赋给另一个字符串时,会得到对内存中同一个字符串的两个引用。但是,string与引用类型在常见的操作上有一些区别。例如字符串是不可改变的。修改其中一个字符串,就会创建一个全新的string对象,而另一个字符串不会发生任何变化。

            string s1 = "abc";//编译器先在内存中找有没有 "abc"字符串。如果有就将 s1 指向它。如果没有就新建一个"abc"字符串并将s1指向它。
            string s2 = s1;//s1指向的是 "abc"字符串 ,所以s2也指向的是 "abc"字符串。
            s1 = "aaa";//编译器先在内存中找有没有 "aaa"字符串,如果有就将 s1 指向它。如果没有就新建一个"aaa"字符串并将s1指向它。 这时的 s2还是指向在 "abc"字符串。"abc"字符串并没有销毁。
            //也就是说,内存中只存在一个"abc"字符串。

            int i1 = 5;//编译器在内存中找到一个地方将5存放进去,赋值给i1。
            int i2 = i1;//编译器在内存中先找出i1的值,重新找个地方将5放进去,赋值给i2。(这个时候内存中有两个地方存放5.)
            i1 = 7;//编译器在内存中将5改为7。

以上仅是自己猜想。

值类型可以理解为:

小明手里有一个棒棒糖,小红过来后,小明给小红一个和自己手上一模一样的棒棒糖。这时候,小明吃了一口自己手上的棒棒糖,而小红手上的棒棒糖没有变化。

引用类型可以理解为:

小明手上有个电视遥控器,小明可以用遥控器选自己喜欢的看的“海绵宝宝”,小红手上也有一个和小明手上一模一样的遥控器,小红也可以用遥控器选自己喜欢看的“黑猫警长”。小明可以选自己喜欢看的,小红也可以选直接喜欢看的。这时候电视上只能播放一个节目。也就是说,无论小明和小红怎么修改,但只能反馈相同的一个结果。


更多详解 《慕课网

扫描二维码推送至手机访问。

版权声明:本文由小道发布,如需转载请注明出处。

本文链接:https://daobk.com/post/39.html

分享给朋友:
返回列表

上一篇:构造函数

下一篇:继承

“对象的引用” 的相关文章

写一个输出结果为:“10+20=30” 控制台应用程序

写一个输出结果为:“10+20=30” 控制台应用程序

写一个输出结果为:“10+20=30” 控制台应用程序             int i1 = 10;//定义一个整型变量i1,并赋值为1...

if语句应用:依次提示用户输入两个整数

if语句应用:依次提示用户输入两个整数

依次提示用户输入两个整数(假设i1、i2)。如果i1、i2都是正数,则将i1的值递增一个数,然后打印i1+i2的值;如果i1、i2都是负数,则将i1的值递减10个数,然后打印i1*i2的值;如果i1、i2中任一个为0,则提示数据有错误;否则计算i1*i2的绝对值。   ...

数组:​从一个整数数组中取出最大的整数。

数组:​从一个整数数组中取出最大的整数。

保存多个值。任意类型都可以声明数组。int[] nums = {5,3,8};//数组可以直接赋值。 int[] nums = new int[3];//也可以先声明数组 不赋值。   &...

面向对象概念

面向对象概念

面向对象不是取代面向过程的。类、对象。“人”是类,“张三”是“人”这个类的对象。类是抽象的,对象是具体的。按钮就是类,某个按钮就是对象。对象可以叫做类的实例(Instance)。类就像int,对象就像10。字段Field(和某个对象相关的变量),字段就是类的状态。人这个类有姓名、年龄、身高等字段。类...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。