比较C#中值范例和援用范例的区分【C#.Net教程】,csharp,.net,区别
作者:搜教程发布时间:2019-11-27分类:.Net教程浏览:22评论:0
导读:CLR支撑两种范例:值范例和援用范例,看起来FCL的大多数范例是援用范例,但用的最多的照样值范例。援用范例老是从托管堆中分派,在用new操纵符实例一个对象,返回对象内存地址存放在一...
CLR支撑两种范例:值范例和援用范例,看起来FCL的大多数范例是援用范例,但用的最多的照样值范例。援用范例老是从托管堆中分派,在用new操纵符实例一个对象,返回对象内存地址存放在一个变量中。在运用援用范例时要相识其四个心理因素:
1.内存必需从托管堆中分派
2.堆上分派的每一个对象都有一些分外成员,这些成员在运用前必需初始化。
3.对象中的其他字节老是设为零。
4.从托管堆分派对象时,能够强制实行一次垃圾接纳。
因而可知,援用范例如果滥用必将形成过载。再看值范例,其是轻量级范例,平常分派在线程栈上也可嵌入到援用范例对象中,承载它的变量不包括指向实例的指针,固然也不受垃圾接纳器的掌握,因而值范例的运用缓解了托管堆的压力,减少了应用程序生存期内的垃圾接纳的次数。
C#中称为‘类’的都是援用范例,而值范例都成为构造或罗列。一切构造都是由笼统范例System.ValueType直接派生。而其自身有直接从Object派生,一切罗列从System.Enum笼统范例派生,Enum又从ValueType派生,环环相扣啊。
在设想本身的范例时,什么时刻将定义成值范例呢?
1.范例具有基元范例的行动(编译器直接支撑的数据范例(像Int32,Int64等))
2.范例不须要从其他任何范例继续。
3.范例也不派生出其他任何范例。
4.因为值范例在作为实参或是返回值的时刻,须要举行响应字段的复制,如若实例过大,会形成肯定的机能丧失。
所以请求范例实例较小(16字节之内),实例较大,但不作为要领实参通报和从要领返回也可。
关于值范例和援用范例的区分,大抵列了一下几点:
1.援用范例处于已装箱情势,值范例处于未装箱情势,二者也可通过肯定体式格局相互转换(细致申明会在下一篇博客中详谈)
2.值范例不该引入任何新的虚要领,一切要领都不能是笼统的,且都是隐式密封防备重写。
3.将值范例变量赋给另一个值范例变量,会实行逐字段复制。将援用范例的变量付给另一个援用范例,只复制内存地址。两个或多个援用范例变量能援用堆上的同一个对象,对一个变量实行的操纵能够影响到另一个变量援用的对象。相反,值范例变量自力,不相互影响。
4.未装箱的值范例不在堆上分派,所以该范例的一个实例一旦不在运动,为他们分派的存储就会开释,不会守候垃圾接纳
1.内存必需从托管堆中分派
2.堆上分派的每一个对象都有一些分外成员,这些成员在运用前必需初始化。
3.对象中的其他字节老是设为零。
4.从托管堆分派对象时,能够强制实行一次垃圾接纳。
因而可知,援用范例如果滥用必将形成过载。再看值范例,其是轻量级范例,平常分派在线程栈上也可嵌入到援用范例对象中,承载它的变量不包括指向实例的指针,固然也不受垃圾接纳器的掌握,因而值范例的运用缓解了托管堆的压力,减少了应用程序生存期内的垃圾接纳的次数。
C#中称为‘类’的都是援用范例,而值范例都成为构造或罗列。一切构造都是由笼统范例System.ValueType直接派生。而其自身有直接从Object派生,一切罗列从System.Enum笼统范例派生,Enum又从ValueType派生,环环相扣啊。
在设想本身的范例时,什么时刻将定义成值范例呢?
1.范例具有基元范例的行动(编译器直接支撑的数据范例(像Int32,Int64等))
2.范例不须要从其他任何范例继续。
3.范例也不派生出其他任何范例。
4.因为值范例在作为实参或是返回值的时刻,须要举行响应字段的复制,如若实例过大,会形成肯定的机能丧失。
所以请求范例实例较小(16字节之内),实例较大,但不作为要领实参通报和从要领返回也可。
关于值范例和援用范例的区分,大抵列了一下几点:
1.援用范例处于已装箱情势,值范例处于未装箱情势,二者也可通过肯定体式格局相互转换(细致申明会在下一篇博客中详谈)
2.值范例不该引入任何新的虚要领,一切要领都不能是笼统的,且都是隐式密封防备重写。
3.将值范例变量赋给另一个值范例变量,会实行逐字段复制。将援用范例的变量付给另一个援用范例,只复制内存地址。两个或多个援用范例变量能援用堆上的同一个对象,对一个变量实行的操纵能够影响到另一个变量援用的对象。相反,值范例变量自力,不相互影响。
4.未装箱的值范例不在堆上分派,所以该范例的一个实例一旦不在运动,为他们分派的存储就会开释,不会守候垃圾接纳
以上就是比较C#中值范例和援用范例的区分的细致内容,更多请关注ki4网别的相干文章!
相关推荐
- h5页面和普通页面的区别是什么?_html5教程,h5页面,普通页面,区别
- MySQL中普通索引和唯一索引的区别详解_MySQL教程,mysql,普通索引,唯一索引,区别
- JDK动态代理和CGLIB区别_JAVA教程,JDK,CGLIB,区别
- interface和abstract class的区别_JAVA教程,interface,abstract class,区别
- int和Integer的区别_JAVA教程,int,Integer,区别
- ResultMap和ResultType的区别_JAVA教程,ResultMap,ResultType,区别
- java中的设计模式与框架有什么区别_JAVA教程,java,设计模式,框架,区别
- Java引用与C指针的区别是什么_JAVA教程,Java,引用,C,指针,区别
- 实例详解php中empty、isset、isnull三者之间的区别_php教程,php,empty,isset,isnull,区别
- java中的援用与c++中的指针的区分【JAVA教程】,java,引用,c++,指针,区别
你 发表评论:
欢迎- .Net教程排行
-
- 1案例分享c++ map的运用和 查找机能测试【C#.Net教程】,性能,map,c++
- 2细致引见C# string花样的日期时候字符串转为DateTime范例的要领【C#.Net教程】,C#,string,DateTime
- 3详解ASP.NET中衔接数据库设置要领【C#.Net教程】,ASP.NET,数据库,配置
- 4c#怎样运用?c#的基础语法【C#.Net教程】,c#,关键字
- 5C# DataSet机能最好实践【C#.Net教程】,C#,DataSet
- 6C#_挪用封装的一个类完成导出Excel表格的功用【C#.Net教程】,C# Excel表格
- 7asp .net 面试题及答案分享【C#.Net教程】,.net,自己,整理,问题,面试
- 8让WebAPI 返回JSON花样的数据实例教程【C#.Net教程】,javascript,WebAPI,JSON,api,web,搭建,返回
- 9.net和c#有什么区别【C#.Net教程】,.net,c#
- 最新文章
- 广而告之