专栏首页女程序员的日常值类型和引用类型的区别,struct和class的区别

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

C#值类型和引用类型

1、简单比较

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

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

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

  值类型的实例通常是在线程栈上分配的(静态分配),但是在某些情形下可以存储在堆中。引用类型的对象总是在进程堆中分配(动态分配)。

2、相同点

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

3、不同点

  1)范围方面

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

  2)内存分配方面

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

  3)适用场合

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

  • 引用类型可以派生出新的类型,而值类型不能,因为所有的值类型都是密封(seal)的;
  • 引用类型可以包含null值,值类型不能(可空类型功能允许将 null 赋给值类型,如   int? a = null;  );
  • 引用类型变量的赋值只复制对对象的引用,而不复制对象本身。而将一个值类型变量赋给另一个值类型变量时,将复制包含的值。

结构体和类

1、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++中的结构体和类体现了数据结构和算法的结合。

2、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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • STM8S——Clock control(CLK)

    1、主时钟源   有四种时钟源可以用做主时钟: (1)1-24MHz高速外部晶体振荡器(HSE) (2)最大24MHz高速外部时钟信号(HSE user-ext...

    Christal_R
  • 坏块管理(Bad Block Management,BBM)

      看了很多坏块管理的文章,加上自己的理解,把整个坏块管理做了个总结。 坏块分类 1、出厂坏块   又叫初始坏块,厂商会给点最小有效块值(NVB,mininum...

    Christal_R
  • Effective C++学习笔记之#define

      条款02:尽量以const、enum、inline替换#define;尽可能用编译器代替不必要的预处理器。

    Christal_R
  • go 参数传递

    http://stor.51cto.com/art/201712/559955.htm go 中都是值传递的,即使是map、切片这些。 只不过类型分为:

    平凡的学生族
  • Golang学习笔记 数据类型和变量

    数据类型 先来介绍一下Golang的数据类型。 布尔型 bool类型代表逻辑值,有真值true和假值false两种取值。 整数类型 整数类型有如下几种,这些整数...

    乐百川
  • Go语言核心编程(3)——类型系统

    注:本文是《Go语言核心编程》(李文塔/著)个人读书笔记 命名类型(Named Type) 类型可以通过标识符来表示,这种类型称为命名类型。Go 语言的基本...

    羊羽shine
  • 第6章 类型系统

    6.3 基本类型(Primitive Types) 6.3.1 Number: 包含整型与浮点型等 6.3.2 Char: 字符类型(Character) ...

    一个会写诗的程序员
  • 八、通用类型系统

    1、通用类型简介         CLR中的一切都围绕类型展开,因为IL是面向对象的高级机器语言.类型向应用程序和其他类型公开了功能.通过类型,用一种编程语言写...

    郑小超.
  • Go语言实战笔记(七)| Go 类型

    Go 语言是一种静态类型的编程语言,所以在编译器进行编译的时候,就要知道每个值的类型,这样编译器就知道要为这个值分配多少内存,并且知道这段分配的内存表示什么。

    飞雪无情
  • [程序设计语言]-[核心概念]-04:数据类型

    0. 概述 为何高级语言需要类型系统这个概念?在汇编时代是没有完整的数据类型系统的,结构化编程引入了结构化的控制流、为结构化设计的子程序,随之这种结构化的代码所...

    blackheart

扫码关注云+社区

领取腾讯云代金券