值类型和引用类型的区别,struct和class的区别

C#值类型和引用类型

一、简单比较

  值类型的变量直接存储数据,而引用类型的变量持有的是数据的引用,数据存储在数据堆中。c++

  值类型(value type):byte,short,int,long,float,double,decimal,char,bool 和 struct 统称为值类型。值类型变量声明后,无论是否已经赋值,编译器为其分配内存。算法

  引用类型(reference type):string 和 class统称为引用类型。当声明一个类时,只在栈中分配一小片内存用于容纳一个地址,而此时并无为其分配堆上的内存空间。当使用 new 建立一个类的实例时,分配堆上的空间,并把堆上空间的地址保存到栈上分配的小片空间中。数组

  值类型的实例一般是在线程栈上分配的(静态分配),可是在某些情形下能够存储在堆中。引用类型的对象老是在进程堆中分配(动态分配)。数据结构

 

二、相同点

  • 引用类型能够实现接口,值类型当中的结构体也能够实现接口;
  • 引用类型和值类型都继承自System.Object类。

 

三、不一样点

  1)范围方面数据结构和算法

  • C#的值类型包括:结构体(数值类型、bool型、用户定义的结构体),枚举,可空类型。
  • C#的引用类型包括:数组,用户定义的类、接口、委托,object,字符串。

 

  2)内存分配方面函数

  • 数组的元素无论是引用类型仍是值类型,都存储在托管堆上。
  • 引用类型在栈中存储一个引用,其实际的存储位置位于托管堆。简称引用类型部署在托管推上。而值类型老是分配在它声明的地方:做为字段时,跟随其所属的变量(实 例)存储;做为局部变量时,存储在栈上。(栈的内存是自动释放的,堆内存是.NET中会由GC来自动释放)

 

  3)适用场合spa

  值类型在内存管理方面具备更好的效率,而且不支持多态,适合用作存储数据的载体;引用类型支持多态,适合用于定义应用程序的行为。.net

  • 引用类型能够派生出新的类型,而值类型不能,由于全部的值类型都是密封(seal)的;
  • 引用类型能够包含null值,值类型不能(可空类型功能容许将 null 赋给值类型,如   int? a = null;  );
  • 引用类型变量的赋值只复制对对象的引用,而不复制对象自己。而将一个值类型变量赋给另外一个值类型变量时,将复制包含的值。

 

结构体和类

一、C和C++中结构体的不一样 

  1)C语言中的结构体不能为空线程

  为空,会报错1>d:\myproject\visual studio 2013\projects\myc++\main.c(71): error C2016: C 要求一个结构或联合至少有一个成员
 

  2) C语言中的结构体只涉及到数据结构 对象

  C语言中的结构体只涉及到数据结构,而不涉及到算法,也就是说在C中数据结构和算法是分离的。换句话说就是C语言中的结构体只能定义成员变量,可是不能定义成员函数。然而在C++中既能够定义成员变量又能够定义成员函数, C++中的结构体和类体现了数据结构和算法的结合。
 

二、C++中的结构体与类的区别

  1)概念

  class和struct的语法基本相同,从声明到使用,都很类似,可是struct的约束要比class多,理论上,struct能作到的class都能作到,但class能作到的stuct却不必定作的到。

  2)类型

  struct是值类型,class是引用类型,所以它们具备全部值类型和引用类型之间的差别。

  3)效率

  因为堆栈的执行效率要比堆的执行效率高,可是堆栈资源却颇有限,不适合处理逻辑复杂的大对象,所以struct经常使用来处理做为基类型对待的小对象,而class来处理某个商业逻辑。

  4)关系

  struct不只能继承也能被继承 ,并且能够实现接口,不过Class能够彻底扩展。内部结构有区别,struct只能添加带参的构造函数,不能使用abstract和protected等修饰符,不能初始化实例字段。

 

参考文章:

1. 详解C结构体、C++结构体 和 C++类的区别

http://blog.csdn.net/loving_forever_/article/details/51483828#comments

2. C#详解值类型和引用类型区别

http://blog.csdn.net/qiaoquan3/article/details/51202926#comments

相关文章
相关标签/搜索