net的值类型与引用类型

来源:互联网 发布:广州市启凡网络 编辑:程序博客网 时间:2024/06/04 18:57
.Net中的数据类型是程序员需要认真掌握的基础知识。.NET 中类型的两个基本类别是“值类型”和“引用类型”。基元类型、枚举和结构为值类型。类、字符串、标准模块、接口、数组和委托为引用类型。
所有的类型要么是值类型,要么是引用类型,但有一种情况例外。根类型 System.Object ,它非常特殊,因为它既不是引用类型也不是值类型,而且不能实例化。因此,类型 Object 的变量可包含值类型或引用类型。
不过无论值类型还是引用类型,它们的声明方式都是一样的,当然它们的语义是不同的。 
值类型直接存储在堆栈上,要么在数组中,要么在另一个类型中。值类型总是直接访问;不可能创建对值类型的引用。值类型的值不能为空引用,值类型的变量赋值会创建所赋的值的副本。简单的说呢,
值类型: 
      单元直接存放“有效值” 
      如: 
      int a=3; 
      则a内存单元就放的是3 

      引用类型: 
      单元放的是另外一个对象的引用(地址) 
      如: 
      Form form1=new Form(); 
      就是说,在内存中开辟了一个对象new Form(),form1内存单元存放的是那个对象的地址,并非对象本身

 

栈和堆 
 
A.栈的特点是快速高效,缺点是有限制,数据不灵活;而堆的特点是灵活方便,数据适应面广泛,但是效率有一定降低。
B.栈的内存分配是自动释放,也就没有释放函数。堆空间的分配总是动态的,在.NET中会有GC来处理内存的释放。
 
除了接口是个例外,通用类型系统中的类型被分为两类:值类型和引用类型。引用类型的变量并不包含类型的实例,而只是包含对实例的引用。但在使用引用类型时会有一些性能上的问题,因此如果一个系统全部用引用类型,则这个系统的性能会大大减弱;因此.NET Framework 设计者保留了struct 数据类型(是值类型),而在 java 语言中就没有 struct 数据类型。
 
值类型:
            包括基元类型、用户自定义结构或枚举类型
            继承自System.ValueType类型
            在堆栈上分配
            通过拷贝赋值
            默认通过值来传递参数,除非用ref关键字
 
引用类型:
            C#预定义的引用类型包括object和string类型,用户定义的引用类型可以是接口类型、类类型和委托类型
            继承自System. Object类型
            在托管堆上用“new”关键字分配
            通过引用赋值
            可能出现几个引用指向同一个对象,因此对一个变量的操作会影响另一个变量所引用的同一对象
            用引用来传递变量
原创粉丝点击