美文网首页
值类型 和 引用类型

值类型 和 引用类型

作者: 道阻且长_行则将至 | 来源:发表于2017-01-01 22:40 被阅读9次

不理解引用类型和值类型区别 的程序员将会给代码引入 诡异的bug和性能问题(也就是我们编程过程中所说的“灵异事件”)---某C#大神如是说

废话不多说,先上代码:

Program类

class Program
    {
        static void Main(string[] args)
        {
            //这里是引用Human类的属性 不论他们是什么类型 在这里都是引用类型
            Human man1 = new Human(); //实例化man1并给属性赋值
            man1.name = "Michael";
            man1.age = 24;

            Human man2 = man1; //本质上是把man2的地址指向man1地址指向的堆里的内容  这里man2 name 为michael age为24  

            man1.name = "Qiao"; //man1地址堆里的内容改变了 也就意味着man2所指向的内容也改变了
            man1.age = 18;
            Console.WriteLine("man1:{0}/t{1}",man1.name,man1.age);
            Console.WriteLine("man2:{0}/t{1}",man2.name,man2.age);


            //这里是类中自己的变量
            //string是一种特殊的引用类型 改变的是栈中的引用 堆中的数据并未改变
            string name = "siki";
            string name2 = "taikr";
            name2=name; 
            name = "google"; //在这里相当于 name2=new name2(); 重新又定义了一个字符串  而不是改变原有的堆中的值

            //值类型 改变的是实际数值
            int age = 24;            
            int age2 = age;            
            age2 = 25;
            age = 20;

            Console.WriteLine("name={0},name2={1}",name,name2);
            Console.WriteLine("age={0},age2={1}", age, age2);
            Console.ReadKey();
        }
    }

Human类

  class Human
    {
        public string name = "Michael";
        public int age = 20;
    }

输出结果

man1:Qiao/t18
man2:Qiao/t18
name=google,name2=siki
age=20,age2=25

概念

  • 值类型

值类型(value type):直接将内存存储在栈内,由系统自动释放资源的数据类型.基本数据类型赋值都属于值传递,值传递传递的是实实在在的变量值,是传递原参数的拷贝,值传递后,实参传递给形参的值,形参发生改变而不影响实参。
值类型包括:byte,short,int,long,float,double,decimal,char,bool 和 struct 统称为值类型。值类型变量声明后,不管是否已经赋值,编译器为其分配内存。

  • 引用类型

引用类型(reference type): 引用类型之间赋值属于引用传递。引用传递传递的是对象的引用地址,也就是它的本身(自己最通俗的理解)。引用传递:传的是地址,就是将实参的地址传递给形参,形参改变了,实参当然被改变了,因为他们指向相同的地址。
引用类型和C语言的指针很相像,当声明一个类时,只在栈中分配一小片内存用于容纳一个地址,而此时并没有为其分配堆上的内存空间。当使用 new 创建一个类的实例时,分配堆上的空间,并把堆上空间的地址保存到栈上分配的小片空间中。

区别

  • 1.它们存储的位置不一样,值类型一般储存在栈中,引用类型的指针在栈空间,值在堆空间
  • 2.引用类型变量的赋值只复制对对象的引用,而不复制对象本身。引用类型的多个对象指向同一个地方时,修改某一个的时候,其它对象的值会发生改变。而将一个值类型变量赋给另一个值类型变量时,将复制包含的值。

相关文章

  • 面试

    值类型和引用类型 值类型和引用类型的区别是值类型直接存储其值,而引用类型存储对值的引用。这两种类型存储在内存的不同...

  • 慕课网《前端JavaScript基础面试技巧》学习笔记

    变量类型 值类型和引用类型 值类型只能存储一个值 值类型复制就是值类型本身 引用类型复制只是复制引用类型的指针 引...

  • 基本类型值和引用类型值

    JavaScript变量可以用来保存两种类型的值:基本类型值和引用类型值。 *引用类型包括: 基本类型值和引用类型...

  • 对象

    1.对象分为值类型和引用类型 值类型(不是对象) 引用类型(都是对象) 类型的判断值类型判断用typeof引用类型...

  • 01_JS面向对象

    知识点 数据类型 值类型和引用类型 值类型和引用类型的特征 值类型和引用类型做参数 对象的动态特性 给对象动态添加...

  • C# 装箱,拆箱,向上转型,向下转型

    c#中,数据类型分为值类型和引用类型,装箱和拆箱属于值类型和引用类型间的转换操作。 装箱:值类型向引用类...

  • 第一部分:C#语言基础

    第1章 C#类型基础 C#中的两种类型:值类型和引用类型 1.1 值类型和引用类型 值类型包括了结构和枚举,引用类...

  • c#面向对象11--值类型和引用类型/序列化和反序列化

    值类型和引用类型 值类型:int double char enum bool decimal struct引用类型...

  • C#值类型和引用类型

    值类型和引用类型的区别(小结)相同点:引用类型可以实现接口,值类型当中的结构体也可以实现接口;引用类型和值类型都继...

  • 引用类型对象拷贝

    1.引用类型有哪些?非引用类型有哪些 JavaScript数据分为基本类型值和引用类型值基本类型值(数值、布尔值、...

网友评论

      本文标题:值类型 和 引用类型

      本文链接:https://www.haomeiwen.com/subject/gdxbvttx.html