• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C#每天进步一点--引用类型和值类型

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

  在刚参加工作面试时,我们经常会遇到有关值类型和引用类型的问题,你回答的怎么样直接影响你在别人心目中的印象,你回答的不好说明你对C#没有深入的了解学习,今天我带大家回顾下C#中的引用类型和值类型。

    CLR支持两种类型:引用类型和值类型。虽然FCL中大多数类型都是引用类型但程序中用的最多的还是值类型。引用类型总是从托管堆上分配的,C#的new操作会返回对象的内存地址--也就是指向对象的数据的内存地址。

    设想假设每次使用一个Int32值时,都进行一次内存分配,性能会受到多大的影响,为了提升简单、常用的类型的性能,CLR提供了名为“值类型”的轻量级类型。值类型的实例一般在线程栈上分配。在代表值类型实例的一个变量中,并不包含一个指向实例的指针。相反,变量中包含了实例本身的字段。值类型的实例不受垃圾回收器的控制。因此,值类型的使用缓解了托管堆中的压力,并减少了一个应用程序在其生命周期需要进行的垃圾回收次数。

   .net framework SDK文档清楚地指出哪些类型是引用类型,哪些是值类型。任何称为“类”的类型都是引用类型,例如,System.Exception 类、System.IO.FileStream 类以及System.Random类都是引用类型。相反文档将所有的值类型称为结构或枚举。例如, System.In32结构、System.Boolean结构、System.Decimal结构、System.DayOfWeek枚举以及System.Drawing.FontStyle枚举都是值类型。

  所有的结构都是抽象类型System.ValueType的直接派生类。System.ValueType本身又是System.Object派生的,所有的值类型都必须从System.ValueType派生。所有的枚举都是从System.Enum抽象类型派生,后者又是从System.ValueType派生的。

   以下代码演示了引用类型和值类型。

//引用类型(由于使用了‘Class’)
class SomeRef{public Int32 x;}

//值类型(由于使用了‘Struct’)
struct SomeVal{public Int32 x;}

static void ValueTypeDemo(){
   SomeRef r1 = new SomeRef();   //在堆上分配
   SomeVal v1 = new SomeVal(); //在栈上分配
   r1.x = 5;                                  //提领指针
   v1.x = 5;                                 //在栈上修改
   Console.WriteLine(r1.x);         //显示“5”
   Console.WriteLine(v1.x);        //同样显示“5”

   SomeRef r2 = r1;                   //只复制引用(指针)
   SomeVal v2 = v1;                  //在栈上分配并复制成员
   r1.x = 8;                                //r1.x和r2.x都会更改
   v1.x = 9;                               //v1.x会更改,但v2.x不变

   Console.WriteLine(r1.x);         //显示“8”
   Console.WriteLine(r2.x);         //显示“8”
   Console.WriteLine(v1.x);         //显示“9”
   Console.WriteLine(v2.x);          //显示“5”
   
}

  先就说这么多了,希望对大家有所帮助,和大家一起进步。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#如何用正则表达式截取https和带端口的域名发布时间:2022-07-13
下一篇:
C#WinForm中DataGridView控件绑定对象或List发布时间:2022-07-13
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap