深入c# 类和结构的区别总结详解

时间:2023-01-25 10:27:27 

类和结构的区别:
1.一个是引用类型一个是值类型
Class是引用类型,继承自System.Object类
Struct是值类型,继承自System.ValueType类,因此不具有多态性
因为结构是值类型,所以结构之间赋值可以创建新的结构,复制包含结构的变量时,讲复制所有的数据,对新的副本所作的修改都不会改变旧副本的数据,而类是引用类型,类之间的赋值只是复制引用。
2. 继承性的区别
Class支持继承,可以继承自类和接口,是完全可扩展的,除非声明sealed。否则类可以继承自其它的类的接口,自身也能被继承。
Struct没有继承性,不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确地用sealed声明,但是结构师隐式的sealed。Struct支持接口继承。
3.内部结构:
结构

没有默认的(无参数)构造函数,但是可以添加构造函数,结构可以声明构造函数,但是他们必须是带参数的。
有默认的构造函数
没有析构函数
有析构函数
没有abstract和sealed(因为不能继承)
可以使用abstract和sealed
不能有protected修饰符,不可以声明protected,virtual,sealed和override成员
可以声明protected,virtual,sealed,override成员
可以不使用new初始化
必须使用new初始化,struct在声明时就进行了初始化过程,所有的成员变量均默认为0或null
在结构中初始化实例字段是错误的
Struct变量使用完之后就自动解除内存分配
Class实例有垃圾回收机制来保证内存的回收处理
Struct创建的对象复制简单,直接以等号连接即可
Class对象复制分为浅复制和深复制,必须经过特别的方法来完成复制
我们可以简单地理解为class是一个可以动的机器,有行为,有多台,有继承,而struct是一个零件箱,组合了不同结构的零件,其实class和struct最本质的区别在于class是引用类型,内存分配在托管堆,而struct是值类型,内存分配在线程堆栈上,此差异导致了上述的所有的不同。
4.如何选择类和结构
(1)实现一个主要勇于存储数据的结构时,可以考虑结构
(2)Struct变量占用堆栈的空间,因此适用于数据量相对小的场合,堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些。
(3)结构数组具有更高的效率
(4)结构表示如点,矩形和颜色这样轻量的对象,例如,如果声明一个含有1000个点的对象数组,则将为引用每个对象分配附加的内存,在此情况下,结构的成本较低。
(5)在表现抽象和多级别的对象层次时,类是最好的选择
(6)在大多数情况下,该类型只是一些数据时,结构师最佳的选择。

标签:类,结构,区别
0
投稿

猜你喜欢

  • C#自定义鼠标拖拽Drag&Drop效果之基本原理及基本实现代码

    2021-06-09 14:09:24
  • 在Java中String和Date、Timestamp之间的转换

    2023-10-07 13:52:36
  • C#实现单词本功能

    2021-11-06 13:08:23
  • Java执行SQL脚本文件到数据库详解

    2023-08-08 08:30:00
  • ArrayList和LinkedList的区别、扩容机制以及底层的实现方式

    2023-11-27 01:26:57
  • Android引入OpenCV的示例

    2022-04-26 08:19:33
  • 解决Android Studio4.1没有Gsonfomat插件,Plugin “GsonFormat” is incompatible的问题

    2021-08-27 22:10:37
  • Android NotificationListenerService 通知服务原理解析

    2022-03-29 05:34:29
  • Compose 的 Navigation组件使用示例详解

    2023-02-12 12:43:43
  • Flutter Shell自动化打包解放双手

    2021-09-17 18:39:15
  • Android 5.0中CoordinatorLayout的使用技巧

    2023-02-24 13:58:18
  • Android学习笔记(一)环境安装及第一个hello world

    2022-03-10 03:05:43
  • Java开发学习 Eclipse项目有红感叹号解决之道

    2022-10-22 15:29:27
  • C# Directory.GetFiles()函数案例详解

    2022-12-10 04:51:02
  • C语言使用strcmp()函数比较两个字符串的实现

    2023-10-15 13:06:55
  • Spring框架中一个有用的小组件之Spring Retry组件详解

    2021-05-27 10:07:40
  • IDEA 2020 本土化,真的是全中文了(真香)

    2023-11-25 08:02:58
  • Android自定义Chronometer实现短信验证码秒表倒计时功能

    2022-02-22 10:52:47
  • C#判断数据类型的简单示例代码

    2023-09-22 22:22:48
  • maven install报错中程序包xxx不存在的问题解决

    2023-03-05 03:06:51
  • asp之家 软件编程 m.aspxhome.com