C#引用类型和值类型的区别

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

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是不会自动回收的,例如数据库链接,文件等。
时间: 2024-10-12 14:49:30

C#引用类型和值类型的区别的相关文章

【转】c#引用类型与值类型的区别大盘点

解析:CLR支持两种类型:值类型和引用类型.用Jeffrey Richter(<CLR via C#>作者)的话来说,“不理解引用类型和值类型区别的程序员将会把代码引入诡异的陷阱和诸多性能问题”.这就要求我们正确理解和使用值类型和引用类型. 值类型包括C#的基本类型(用关键字int.char.float等来声明),结构(用struct关键字声明的类型),枚举(用enum关键字声明的类型):而引用类型包括类(用class关键字声明的类型)和委托(用delegate关键字声明的特殊类).C#中的每

C#基础知识-引用类型和值类型的区别(六)

在第一篇中我们介绍了C#中基本的15种数据类型,这15种数据类型中又分为两大类,一种是值类型,一种是引用类型.值类型有sbyte.short.long.int.byte.ushort.uint.ulong.float.double.bool,引用类型有object.string.class类型,这两大类最大的区别就是在内存中存储的位置.方式不一样.(当我们打开运行一个程序的时候,实际上就会把当前程序需要执行的资源从硬盘加载到内存中,再把内存的数据送去CPU处理),现在来看一下它们是如何来进行存储

c# 引用类型与值类型的区别有哪些

解析:CLR支持两种类型:值类型和引用类型.用Jeffrey Richter(<CLR via C#>作者)的话来说,“不理解引用类型和值类型区别的程序员将会把代码引入诡异的陷阱和诸多性能问题”.这就要求我们正确理解和使用值类型和引用类型. 值类型包括C#的基本类型(用关键字int.char.float等来声明),结构(用struct关键字声明的类型),枚举(用enum关键字声明的类型):而引用类型包括类(用class关键字声明的类型)和委托(用delegate关键字声明的特殊类).C#中的每

C#中引用类型和值类型的区别,分别有哪些

C#的值类型包括:结构体(数值类型,bool型,用户定义的结构体),枚举,可空类型. C#的引用类型包括:数组,用户定义的类.接口.委托,object,字符串. 数组的元素,不管是引用类型还是值类型,都存储在托管堆上. 引用类型在栈中存储一个引用,其实际的存储位置位于托管堆.为了方便,本文简称引用类型部署在托管推上. 值类型总是分配在它声明的地方:作为字段时,跟随其所属的变量(实例)存储:作为局部变量时,存储在栈上. 值类型在内存管理方面具有更好的效率,并且不支持多态,适合用作存储数据的载体:引

在JavaScript中引用类型和值类型的区别

一.存储方式不一样 基本数据类型 变量存储的是简单的数据段,存储的是具体的值,是轻量级的数据存储方式 引用类型 引用类型的值,可以由多个值构成的对象,引用类型的变量存储的是对象引用地址.引用类型是重量的数据存储方式,分配在堆内存,频繁创建对象有损性能. 引用类型(N多) Object.Array.Date.Function.-- 二.动态属性不一样 1.引用类型能动态添加属性 var person=new Object(); person.name="jack"; person.age

引用类型和值类型的区别

1,值类型的数据存放在内存的栈中,引用类型的数据存放在内存的堆中 2,值类型存取速度快,引用类型存取速度慢 3,值类型表示实际数据,引用类型表示指向存储在内存堆中的数据指针或引用 4,值类型的变量直接存放实际的数据,而引用类型的变量存放的则是数据的地址即对象的引用 5值类型变量直接把变量的值保存在堆栈中,引用类型的变量把实际数据的地址保存在堆栈中,而数据保存在堆中, 值类型:小数(float),整数(int)字符(char),双精度小数(double),高精度小数(decimal)枚举(emun

引用类型和值类型

CLR支持两种类型:引用类型和值类型. 虽然FCL中大多数都是引用类型,但开发人员用的最多的还是值类型.引用类型总是在托管堆上分配的,C#的new操作符会返回对象的内存地址——也就是指向对象数据的内存地址. 使用引用类型必须注意到一些性能问题,首先考虑一下事实: 1)内存必须从托管堆上分配. 2)对上分配的每个对象都有一些额外的成员(比如前面提到过得"类型对象指针"和"同步块索引"),这些成员必须初始化. 3)对象中的其他字节(为字段而设)总是设为零. 4)从托管堆

CLR VIA C#: 基元类型、 引用类型 和 值类型

一.基元类型 . 引用类型 和 值类型的区别: 1.基元类型(primitive type):编译器直接支持的数据类型: 基元类型 直接映射到 FCL 中存在的类型. C# 小写是基元类型,例如:string ,  大写是FCL类型,例如String,  基元类型直接映射到FCL类型,所以这两者之间没有区别,一模一样,不用纠结使用哪种方式了. 支持 直接使用FCL类型, 不使用基元类型, Float 对应 Single FCL类型: dynamic 对应  System.Object FCL类型

NET基础(4):引用类型和值类型

CLR支持两种类型:引用类型和值类型.虽然FCL的大多数类型都是引用类型,但程序员用的最多的还是引用类型,引用类型总是从托管堆分配,c#的new操作符返回对象内存地址-即指向对象数据的内存地址.使用引用类型必须注意性能问题.首先要认清楚以下4个方面: 1.内存必须从托管堆分配. 2.堆上分配的每个对象都有一些额外的成员,这些成员必须初始化. 3.对象中的其它字节(为字段而设)总是设为零. 4.从托管堆分配对象时,可能强制执行一次垃圾回收. 如果所有类型都是引用类型,应用程序的性能将会显著下降.设