C#值类型和引用类型的不同

 

1 C#中有两种类型
  值类型引用类型
     值类型的变量直接包含他们的数据,引用类型存储对他们的数据的引用,后者称为对象:
     简单说:值类型直接存储其值,引用类型存储对值得引用.引用类型分为引用引用的对象。
2***、
  值类型:简单类型、枚举、结构
  引用类型: 类类型、接口类型、数组类型和委托类型、string

3***、值类型引用类型的内存存储
  单纯的说值类型存储在栈上,引用类型存储在托管堆上是不对的。
4***、区别
  1、
    托管堆: 同步块和方法表, x,y,托管堆上的需要GC来回收
    线程堆栈: 没有同步块和方法表
  2、
    值类型赋值是重新创建一个副本
    而引用类型的赋值是共享同一块内存(副本),是指向同一块内存(引用类型的名字相当于指向操作)。只是复制引用而不复制被引用识别的对象。(“引用”和“引用的对象”)
  3、
    值类型引用类型的不同之处就在于值类型的变量直接包括他们的数据,而引用类型的变量把references存储到他们的数据库(Objects)中。
  4、
    所有的值类型从Object中继承来的。任何类型都不能由值类型派生而来,因此,值类型是封闭式的。
  

5***什么时候使用值类型
    1)当类型是一个十分简单的类型,其中没有成员会修改类型的任何实例字段
    2)类型不需要从其他任何类型继承
    3)类型不会派生出其他任何类型
    4)类型的实例较小
    5)类型不作为方法参数传递,也不作为方法的返回类型使用
    6)引用类型可以包含null值,值类型不能(可空类型功能允许将null赋给值类型);

6***什么时候用ref和out
    ref:值类型在传递希望成为引用的时候,ref就是告诉传递的时候不是拷贝,而是同一个副本。
    out:不需要给变量赋初值,使用out也没必要在外面赋初值,是在内部赋“初值”,out传递值是理解成没有初始化的。
  
7***深度分析值类型引用类型(内存中的部署)
    例子:Objectreference r = new object();
    关键字new在托管堆上分配内存空间,并返回一个该内存空间的地址。左边的reference位于栈上,是一个引用,存储着一个内存地址;而这个地址指向的内存(位于托管堆上)里存储着其内容。

    规律:
        1)引用类型部署在托管堆上
        2)值类型总是分配在它声明的地方:作为字段时,跟随其所属的实例存储。作为局部变量时,存储在栈上。
     总结: 引用类型在栈上存储一个引用,其实际的存储位置位于托管堆。

8***装箱与拆箱操作
    1) 装箱操作
       装箱(box)就是将值类型转换为引用类型的过程。而相反的过程就叫拆箱(unbox)。
       装箱时发生了什么?
           (1)在堆上分配内存。因为值类型最终有一个对象代表,所有堆上分配的内存量必须是值类型的大小加上容纳此对象及其内部结构(比如虚拟方法表)所需的内存量。
           (2)值类型的值被复制到新近分配的内存中
           (3)新近分配的对象地址被放到堆栈上,现在它指向一个引用类型

    2)拆箱操作
       注:被装过箱的对象才能被拆箱。
       在装箱的时候,并不需要显示类型转换.但在拆箱时需要类型转换.这是因为在拆箱时对象可以被转换为任意类型.
       注意:装箱操作可以隐式进行,但拆箱操作必须显示。
       首先,检查这个对象实例,看它是否为给定值类型的装箱值。
       然后,把这个实例的值拷贝给值类型的变量。
   要尽量减少装箱与拆箱操作


9***问题
  1)C#中null和""的区别
    string是引用类型:
    string str= null 没有创建内存空间,str中存放的是空引用指针.
    string str="" str中存放的是指向堆中的指针。有指向

    简单地说:
       string str ="";
       给你一张白纸;
       string str = null;
       连白纸也没有。
    string.Empty就相当于""  一般用于字符串的初始化 
    判定为空字符串的几种写法,按照性能从高到低的顺序是:
s.Length == 0 优于 s == string.Empty 优于 s == "" 
 
   2)C#里面的垃圾回收 
      GC(垃圾回收)回收的都是可托管代码,也就是托管堆中的代码
      一般定义一个引用变量,它肯定会在堆上面占用一块空间,栈上有个地址指向这个存储位置,只有当GC发现堆上这个资源在栈上没有地址指向它的时候才把这块内存回收。
      非托管资源GC是不会自动回收的,例如数据库链接,文件等。

转载于:https://www.cnblogs.com/zzunstu/p/3393243.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/421451.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux malloc命令,减少 curl 中内存分配操作(malloc)

今天我在 libcurl 内部又做了一个小改动,使其做更少的 malloc。这一次,泛型链表函数被转换成更少的 malloc (这才是链表函数应有的方式,真的)。研究 malloc几周前我开始研究内存分配。这很容易,因为多年前我们 curl 中就已经有内存…

flume linux 命令,flume启动命令 · Mr.Deng’s Blog

8种机械键盘轴体对比本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?突然发现拖了很久的flume启动命令了,今天就简单讲讲flume的启动命令吧。如何启动flumeflume目录以上是安装flume的目录,flume的启动主要是在…

stm32 IAP + APP ==双剑合一

(扩展-IAP主要用于产品出厂后应用程序的更新作用,上一篇博文详细的对IAP 升级程序做了详细的分析http://blog.csdn.net/yx_l128125/article/details/12992773,考虑到出厂时要先烧写IAP 再烧写APP应用程序要烧写2次增加工人劳动力基础上写了“…

花旗linux 内核 如何调试,揭秘首个运行在Linux平台的核心银行系统

上个星期社区进行了一场直播,关于“新一代核心银行系统解决方案CBOD”——首个运行在Linux平台的核心银行系统。国外上线Linux核心系统的银行已经不少,例如花旗银行在主机系统上装载了Linux系统,处理所有信用卡交易和认证交易,但国…

360发布穿戴设备“儿童卫士”手环

10月29日下午消息,360今日召开发布会发布“儿童卫士”手环,可随时定位孩子位置,并具备安全区域预警、通话连接等功能。这款手环售价199元,将于12月开始销售。 据360透露,儿童卫士具备三大功能: 一、随时定位…

layout_gravity 和 gravity

LinearLayout有两个非常相似的属性: android:gravity与android:layout_gravity。 他们的区别在于: android:gravity 属性是对该view中内容的限定.比如一个button 上面的text. 你可以设置该text 相对于view的靠左,靠右等位置&…

如何用Jquery做图片展示效果

一. 前言 到底用JQuery做出怎样的展示效果? 让我们先来看一下!网页加载时,如图所示: 二.本人思路 这个效果初学者看起来好像有点复杂,其实不太难,关键是理清思路,从后端的数据库中找出我们要展示的图档,将…

linux版本的redis bin,Linux下安装Redis4.0版本(简便方法)

Redis介绍:Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。Redis 与其他 key - value 缓存产品有以下三个特点:Redis支持数据的持久化RDB和AOF,可以将内存中的数据保存在磁盘中,重启的…

win7创建虚拟无线网络

如何用WIN7建立无线热点,供没有无线网的我们在家里轻松使 如何用WIN7建立无线热点,供没有无线网的我们在家里轻松使用,不过你家得有宽带吧!《转》来源: 董昱的日志开启windows 7的隐藏功能:虚拟WiFi和SoftA…

OpenCV图像分割-watershed

转自:Tiger & Pi http://blog.163.com/my_645/blog/static/369785222013310619742/Watershed就是传说中的分水岭算法, 它将一幅图像看成是一块有湖泊和山川组成的地形。 图像灰度值大的像素对应海拔高的山地, 灰度值低的像素对应于海拔低…

MyEclipse下安装MyBatis Generator代码反向生成工具

在http://mybatis.googlecode.com/svn/sub-projects/generator/trunk/eclipse/UpdateSite/下载 features/plugins/里面所有的jar包,新建一个mybatis-generator文件夹,把features跟plugins都丢到mybatis-generator文件夹中,把mybatis-generato…

linux的rootkit工具包,免费Linux杀毒软件Anti-Virus分享

ClamAVClamAV是一个免费的、开源的、通用的Linux系统杀毒工具包。它被用于检测木马,病毒,恶意软件和其他恶意威胁。是邮件网关扫描软件的标准;它支持几乎所有的邮件文件格式。它的主要功能有:它是跨平台的,适用于Linux、Windows和…

无插件,无com组件,利用EXCEL、WORD模板做数据导出(一)

本次随笔主要讲述着工作中是如何解决数据导出的,对于数据导出到excel在日常工作中大家还是比较常用的,那导出到word呢,改如何处理呢,简单的页面导出问题应该不大,但是如果是标准的公文导出呢,要保证其基本格…