C#值类型和引用类型这个概念在刚学习的时候应该就知道了。可是咱们并无深刻的去理解它。越是基础知识其实才是最有用的。对代码的优化,代码质量的提高都有帮助。经过整理本文章,对不少知识也起到了巩固的做用吧。html
1,值类型面试
值类型有:整型,浮点型,十进制,布尔型,struct,枚举。值类型是在线程栈上分配的,值类型也称轻量级类型,一个值类型的变量就包含了值类型的值,因此它没有引用类型的指针。全部值类型的数据都没法为null,因此咱们声明时必须赋初始值。数组
2,引用类型性能
引用类型有:class(类),interface(接口),delegate(委托),object,string,数组。引用类型是在托管堆上分配的,咱们经常使用的new操做符会返回一个对象的指针,也就是对象数据在内存中的地址的一个引用。引用类型的传递其实就是传递对象的指针。引用类型在建立时默认为null,也就是当前变量不指向一个有效的对象,这时若是咱们去读取null对象里的属性值时就会出现咱们常碰见的异常:“未将对象的引用设置到对象的实例”,是否是很熟悉。因此在实际开发中咱们在操做对象的时候必定要先判断该对象是否是为null,避免异常。学习
值类型和引用类型咱们用的都比较多,那确定就避免不了装箱和拆箱操做。优化
3,什么是装箱?spa
装箱就是值类型转为引用类型。线程
4,什么是拆箱?指针
拆箱就是引用类型转为值类型。这里要注意两点:code
4.1,只有被装箱过的对象才能被拆箱。
4.2,一个对象拆箱后只能还原为未装箱以前的类型。看下面代码:
1 int i = 5; 2 object obj = i;//装箱操做 3 Int16 j = (Int16)obj;//拆箱操做
咱们先给i作了装箱操做。而后在拆箱。可是还原的是Int16类型,这里就会抛出异常:“指定的转换无效”。
5,有的同窗说装箱和拆箱都影响性能,那么究竟是装箱影响呢仍是拆箱影响呢仍是都影响呢?
5.1,装箱都发生了什么呢:
1,首先在托管堆中分配好内存,分配的内存量是值类型字段须要的内存量加上托管堆上须要的对象的两个额外成员(对象指针,同步块索引)须要的内存。
2,值类型的字段复制到新分配的内存中。
3,返回对象的地址,也就是对象的引用。
5.2,拆箱都发生了什么呢:
1,获取已装箱的值类型实例的指针。
2,把获取到的值复制到栈。
因此装箱时比较耗费性能的,还有可能引起一次GC操做,而拆箱只是一个获取指针的过程耗费资源比装箱要小的多。正由于值类型有装箱拆箱操做,因此像ArrayList这样的集合性能时很是使人担心的,因此C#2.0出现的泛型:List<>,减小了装箱拆箱操做。
6,应用场景
首先不止时面试的时候会常常问到应用场景这个问题,咱们平时写程序的时候也很清楚,大多状况下咱们都会使用引用类型。那何时会使用值类型呢?
6.1,类型不会有被继承的可能,也不会继承其余的类型。
6.2,类型的实例比较小,不会被作为方法的参数,不会被频繁赋值。
本文就到此结束了。感受本身也学到了很多东西,之后没事的时候也能够拿来看看,同时呢也但愿能够帮助到须要的人,若有错误的地方还望大神指点,继续加油!
原文来自:C#基础知识1-深刻理解值类型和引用类型-曾亚平我的博客