码迷,mamicode.com
首页 > Windows程序 > 详细

c#值类型与引用类型区别

时间:2017-12-23 12:08:48      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:变量   使用   引用   问题   而不是   strong   内存   默认   不可   

  1. 值类型对象的两种表示方式:未装箱和已装箱,引用类型总是处于已装箱
  2. 值类型从System.ValueType派生。该类型提供了与System.Object相同方法,但System.ValueType重写了Equals方法, 能在两个对象的自断值完全匹配的前提下返回true。比外,System.ValueType重写了GetHashCode方法,生成哈希码时,这个重写方法所用的算法会将对象的实例字段中的值考虑在内。由于这个默认实现存在性能问题,所以定义自己的值类型时应重写EqualsGetHashCode方法,并提供它们的显式实现。
  3. 由于不能将值类型作为基类型来定义新的值类型或者新的引用类型,所以不应在值类型中引用任何新的虚方法。所以方法都不能是抽象的,所以方法都隐式密封(不可重写)。
  4. .由于不能将值类型作为基类型来定义新的值类型或者新的引用类型,所以不应在值类型中引用任何新的虚方法。所以方法都不能是抽象的,所以方法都隐式密封(不可重写)。.引用类型的变量包含堆中对象的地址。引用类型的变量创建时默认初始化为null,表明当前不指向有效对象。试图使用null引用类型变量会抛出NullReferenceException异常。相反,值类型的变量总是包含其基础类型的一个值,而且值类型的所有成员都初始化为0。值类型变量不是指针,访问值类型不可能抛出NullReferenceException异常。CLR确实允许为值类型添加“可空”(nullability)标志。
  5. 将值类型变量赋给另一个值类型变量,会执行逐字段的复制。将引用类型的变量赋给另一个引用类型的变量只复制内存地址。
  6. 基于上一条,两个或多个引用变量能引用堆中同一个对象,所以对一个变量执行的操作可能影响到另一个变量引用的对象。相反,值类型变量自成一体,对值类型变量执行的操作不可能影响另一个值类型变量
  7. 由于未装箱的值类型不在堆中分配,一旦定义了该类型的一个实例的方法不再活动,为它们分配的存储就会被释放,而不是等着进行垃圾回收。

c#值类型与引用类型区别

标签:变量   使用   引用   问题   而不是   strong   内存   默认   不可   

原文地址:http://www.cnblogs.com/yan7/p/8092598.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!