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

 更新时间:2013年05月22日 18:04:27   作者:  
本篇文章是对c#中类和结构的区别进行了详细的分析介绍,需要的朋友参考下
类和结构的区别:
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)在大多数情况下,该类型只是一些数据时,结构师最佳的选择。

相关文章

  • C#中Clone一个对象的值到另一个对象案例

    C#中Clone一个对象的值到另一个对象案例

    这篇文章主要介绍了C#中Clone一个对象的值到另一个对象案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • C# Winform实现自定义漂亮的通知效果

    C# Winform实现自定义漂亮的通知效果

    这篇文章主要介绍了C# Winform实现自定义漂亮的通知效果,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • C#中读取App.config配置文件代码实例

    C#中读取App.config配置文件代码实例

    这篇文章主要介绍了C#中读取App.config配置文件代码实例,包括循环读取、单个读取的方法,需要的朋友可以参考下
    2014-08-08
  • C# 迭代器分部类与索引器详情

    C# 迭代器分部类与索引器详情

    这篇文章主要介绍了C#迭代器分部类与索引器详情,迭代器 迭代器解决的是集合访问的问题,提供一种方法顺序访问一个集合对象中的各个元素,而不暴露对象内部标
    2022-07-07
  • C# PictureBox控件方法参数及图片删除重命名上传详解

    C# PictureBox控件方法参数及图片删除重命名上传详解

    这篇文章主要为大家介绍了C# PictureBox控件方法参数及图片删除重命名上传示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • C#实现封装常用Redis工具类的示例代码

    C#实现封装常用Redis工具类的示例代码

    这篇文章主要为大家详细介绍了C#实现封装常用Redis工具类的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-03-03
  • 一篇文章说通C#中的异步迭代器

    一篇文章说通C#中的异步迭代器

    这篇文章主要给大家介绍了如何通过一篇文章说通C#中的异步迭代器的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • vscode设置Fira_Code字体及改变编辑器字体、背景颜色的代码详解

    vscode设置Fira_Code字体及改变编辑器字体、背景颜色的代码详解

    这篇文章主要介绍了vscode设置Fira_Code字体及改变编辑器字体、背景颜色,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • C#实现远程关闭和重启计算机的示例代码

    C#实现远程关闭和重启计算机的示例代码

    这篇文章主要为大家详细介绍了如何利用C#实现远程关闭和重启计算机的功能,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-12-12
  • 总结C#动态调用WCF接口的两种方法

    总结C#动态调用WCF接口的两种方法

    这篇文章给大家总结了C#动态调用WCF接口的两种方法,大家可以根据自己的需求选择对应的方式,下面来一起看看。
    2016-09-09

最新评论