当前位置: 首页 > news >正文

C#——类与结构

在未学习面向对象语言时,我常常将类比作一种结构体,其实类与结构体也确实很相似,类用来做函数的集合,结构用来做变量的集合,接下来将从几个角度刨析类与结构的不同。

类 vs 结构

类和结构在设计和使用时有不同的考虑因素,类适合表示复杂的对象和行为,支持继承和多态性,而结构则更适合表示轻量级数据和值类型,以提高性能并避免引用的管理开销。

类和结构有以下几个基本的不同点:

值类型 vs 引用类型:

  • 结构是值类型(Value Type): 结构是值类型,它们在栈上分配内存,而不是在堆上。当将结构实例传递给方法或赋值给另一个变量时,将复制整个结构的内容。
  • 类是引用类型(Reference Type): 类是引用类型,它们在堆上分配内存。当将类实例传递给方法或赋值给另一个变量时,实际上是传递引用(内存地址)而不是整个对象的副本。

继承和多态性:

  • 结构不能继承: 结构不能继承其他结构或类,也不能作为其他结构或类的基类。
  • 类支持继承: 类支持继承和多态性,可以通过派生新类来扩展现有类的功能。

默认构造函数:

  • 结构不能有无参数的构造函数: 结构不能包含无参数的构造函数(不带传参的)。每个结构都必须有至少一个有参数的构造函数(有传参的)。
  • 类可以有无参数的构造函数: 类可以包含无参数的构造函数(不带传参的),如果没有提供构造函数,系统会提供默认的无参数构造函数。

名词解释:构造函数(Constructor)是一种特殊的方法,主要用于在创建对象时初始化对象(构造函数的主要目的是在对象被创建时设置对象的初始状态或初始值。)。

赋值行为:

  • 类型为类的变量在赋值时存储的是引用,因此两个变量指向同一个对象。
  • 结构变量在赋值时会复制整个结构,因此每个变量都有自己的独立副本。

传递方式:

  • 类型为类的对象在方法调用时通过引用传递,这意味着在方法中对对象所做的更改会影响到原始对象。
  • 结构对象通常通过值传递,这意味着传递的是结构的副本,而不是原始结构对象本身。因此,在方法中对结构所做的更改不会影响到原始对象。

可空性:

  • 结构体是值类型,不能直接设置为 null因为 null 是引用类型的默认值,而不是值类型的默认值。如果你需要表示结构体变量的缺失或无效状态,可以使用 Nullable<T> 或称为 T? 的可空类型。
  • 类默认可为null: 类的实例默认可以为 null,因为它们是引用类型。
  • 性能和内存分配:

  • 结构通常更轻量: 由于结构是值类型且在栈上分配内存,它们通常比类更轻量,适用于简单的数据表示。
  • 类可能有更多开销: 由于类是引用类型,可能涉及更多的内存开销和管理。
using System;
using System.Text;struct Books
{private string title;private string author;private string subject;private int book_id;public void setValues(string t, string a, string s, int id){title = t;author = a; subject = s;book_id = id;}public void display(){Console.WriteLine("Title : {0}", title);Console.WriteLine("Author : {0}", author);Console.WriteLine("Subject : {0}", subject);Console.WriteLine("Book_id :{0}", book_id);}
};
public class testStructure
{public static void Main(string[] args){Books Book1 = new Books(); /* 声明 Book1,类型为 Books */Books Book2 = new Books(); /* 声明 Book2,类型为 Books *//* book 1 方法调用 */Book1.setValues("C Programming","Nuha Ali", "C Programming Tutorial", 6495407);/* book 2 方法调用 */Book2.setValues("Telecom Billing","Zara Ali", "Telecom Billing Tutorial", 6495700);/* 打印 Book1 信息 */Book1.display();/* 打印 Book2 信息 */Book2.display();Console.ReadKey();}}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • MySQL-进阶篇-锁(全局锁、表级锁、行级锁)
  • 两个月冲刺软考——关系模式中的候选关键字与如何分解为无损连接并保持函数依赖的解法(例题讲解,看完必会)
  • 面向对象程序设计原则——里氏替换原则(LSP)
  • 1098 Insertion or Heap Sort
  • 复旦NLP团队新作:大规模语言模型从理论到实践PDF版
  • WHAT - 通过 react-use 源码学习 React(Lifecycles 篇)
  • macos OneNote 2016 for Mac 官方pkg下载地址 - macos 10.15 Catalion 可用Onenote版本官方下载地址
  • 红帽与SUSE对RHEL/CentOS 7系列延长生命周期支持策略:保障企业Linux系统的持续安全与稳定
  • 浅谈常见的分布式ID生成方案
  • Unity获取SceneView尺寸
  • k8s中service对象
  • 【扩散模型(六)】IP-Adapter 是如何训练的?2 源码篇(IP-Adapter Plus)
  • 类图的关联关系
  • VUE-组件间通信(三)全局事件总线
  • CAD二次开发IFoxCAD框架系列(25)- 自动加载和初始化的使用
  • JavaScript 如何正确处理 Unicode 编码问题!
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • Java 网络编程(2):UDP 的使用
  • Mocha测试初探
  • nginx 配置多 域名 + 多 https
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • PV统计优化设计
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • 从零开始在ubuntu上搭建node开发环境
  • 对象管理器(defineProperty)学习笔记
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 码农张的Bug人生 - 初来乍到
  • 入门级的git使用指北
  • 数组的操作
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 携程小程序初体验
  • HanLP分词命名实体提取详解
  • 仓管云——企业云erp功能有哪些?
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #565. 查找之大编号
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (4)STL算法之比较
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (回溯) LeetCode 131. 分割回文串
  • (九)c52学习之旅-定时器
  • (离散数学)逻辑连接词
  • (强烈推荐)移动端音视频从零到上手(上)
  • (转)jdk与jre的区别
  • (自用)仿写程序
  • .CSS-hover 的解释
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • .Net中wcf服务生成及调用