提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
面试的时候会问到这么个比较基础的问题,在第一次遇到的时候并没有了解因此寄了,在专门了解之后才写下这篇,不过后面继续延伸的问题之后会补上。
一、类型区别
在讲之前我要先直接总结:C#的数据类型分为两类:①引用类型 分为类、接口、委托 ②值类型 分为结构体、枚举,所有类型都已Object为基础发展。
贴上刘铁猛老师的图
在面试期间主要考察点在于不同类型的存储位置以及区别和作用
值类型为直接分配一个值的类型,如整型、浮点、布尔、枚举、可用sizeof来计算大小
引用类型不包括存储实际变量数据但包含变量引用,可以理解为是他指向一块内存地址,类型为object dynamic和string
先做总结:值类型为实际的值,引用类型为指向一块地址(地址里面包含啥不管)
值类型存储实际的数,如一般的数据类型都有存储,数据来自教学文档
引用类型的变量是对其数据变量/对象的引用,该类型能够同时引用同一对象,在理解上更像是指针,声明引用类型分别为 类、接口、委托,也提供了内置引用类型 dynamic、object、string,在使用中引用类型更像是包着物体的外包装
二、存储地址
值类型:
数据的存储遵循这一个规律:临时的值存在栈中,较大自己申请的值用在堆中。因为栈的数据系统会自己帮我们处理,但是在这里有些许不同,值类型的数据存储要看是在什么位置,在方法里分配到栈,在类里分配到堆,其原因是因为作为方法里的变量为局部变量,而作为类成员的话就为类的一部分需要长久存储因此会存在堆里.
引用类型:
引用类型需要两段内存,表明两种不同情况:
①实际存储的数据,会存在堆中
②作为引用,指向存储在堆中的实际数据
先说第二种,作为引用指向的地址可以被复制,所以可能会有多个引用类型数据指向同一个地址,因此存储在堆中
第一种在引用类型中所包含的数据一般为值类型,但具备长久存储和大容量的需求所以会放在堆内。
总结
C#数据类型分为两种,①引用类型、②值类型,都源自object类型发展,值类型作为临时变量生存时间短,引用类型不包含存储中的实际变量,只是对对象的引用(指向特定存储的内存位置)
值类型在作为临时变量则存于栈中,随系统自动生成和销毁,但作为对象数据时会存于堆中,引用类型作为引用对象存于栈中,但其对象的数据则会存在堆中