C#核心(24)结构体和类的区别,抽象类和接口的区别(面试常问)

前言

随着上一节我们对StringBulider的讲解落下帷幕,c#核心的知识点我们也即将告一段落,我们讲完了面向对象要用的三大特性(封装,继承,多态)和七大原则。期中自然也不乏一些小的散的碎的的知识点。

今天我们要讲的也正如标题所说,是面试里经常用来开门拷打你的问题

所以我们今天主要讲结论(为了帮助你更好的背诵来对付面试),至于为什么,或者说你想探究他的深层原理,那博主可能就爱能莫助了,我们今天在这里都只会进行很简单的探讨(因为博主水平还没那么厉害,足够厉害了再发一篇讲的更细的),大家主要记住结论。

自然,你想自己根据先前学的知识自己梳理一下也是可以的。

在这节,我们也会简单探讨一下使用的场景和情况,供大家参考。

结构体和类的区别

区别概述

  1. 结构体和类最大的区别在存储空间上,结构体是类型,类是引用类型。
  2. 这意味着,结构体的存储空间在栈上,类的存储空间在堆上
  3. 结构体有封装,但是无继承和多态,也就是说不能使用protected
  4. 结构体的赋值不能为空,类可以。

细节区别

  • 结构体成员变量申明指定初始值 

  • 结构体不能申明无参构造函数,析构函数

  • 需要你进一步专研

结构体的特别之处

结构体可以继承接口,因为接口是行为的抽象,接口是一种只包含方法、属性、事件和索引器的抽象类型,定义了对象应有的行为。它们不依赖于特定的实现,因此结构体和类都可以实现相同的接口。

如何选择

  1. 用继承多态的场景选类
  2. 数据结合为对象优先结构体(类也可以,但是不建议)
  3. 值和引用类型的考虑

抽象类和接口的区别

相同点

  1. 都可以被继承

  2. 都不能直接实例化

  3. 都可以包含方法的申明 

  4. 子类必须实现没有实现的方法

  5. 满足里氏替换原则

区别

  1. 抽象类中可以有构造函数 ,接口不行

  2. 抽象类是单一继承,但是接口可以继承多个

  3. 抽象类中可以有成员变量

  4. 抽象类中也可以申明方法

  5. 抽象类中有访问修饰符

选择 

区别对象和行为的差距,然后在抽象类和接口中进行选择。这两个都是为了规范出现的东西,母的是帮助我们更好规范我们的编程行为。

总结

在本节中,我们深入探讨了 C# 中结构体和类以及抽象类和接口的相关知识,为应对面试提供关键结论。主要学习了以下要点:

  1. 结构体和类的区别
    • 核心差异:结构体为值类型,存储于栈上;类是引用类型,存储在堆上。结构体仅有封装,无继承与多态,不能用 protected;类具备封装、继承和多态。结构体赋值不可为空,类则可以。
    • 细节特性:结构体成员变量声明不能指定初始值,且无法声明无参构造函数和析构函数。不过,结构体能够继承接口,因其抽象行为不依赖特定实现,与类一样可实现相同接口。
    • 应用场景:涉及继承多态时优先选类;将数据组合为对象,结构体是较好选择(类虽也能实现,但不推荐)。
  2. 抽象类和接口的区别
    • 共同特性:二者均可被继承,不能直接实例化,可包含方法声明,子类必须实现未实现的方法,均遵循里氏替换原则。
    • 不同之处:抽象类有构造函数,接口没有;抽象类是单一继承,接口可多重继承;抽象类可拥有成员变量、声明方法并设置访问修饰符。
    • 选用准则:依据对象与行为的差异,在抽象类和接口间抉择,它们的存在旨在规范编程行为。

请期待我的下一篇博客!

期待您的关注与支持,感谢您对于佑梦游戏开发的关注!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/76580.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTMLCSS实现异环网站,期末web作业

本网站是我在学习前端时敲得,仅供学习使用。 这段代码是一个完整的 HTML 网页项目,包含 HTML、CSS 和 JavaScript 部分,用于构建一个名为 “异环” 的网页。网页具备头部导航栏、主体视频展示、图片交互元素、音乐播放控制、视频弹窗播放以及…

Oracle表的别名不能用as,列的别名可以用as

在 Oracle 数据库中,‌表的别名‌和‌列的别名‌在使用 AS 关键字时确实有不同规则,以下是详细说明: 1. 表的别名(Table Alias)‌ ‌不支持 AS 关键字‌,直接跟在表名后即可。‌语法示例‌: S…

【SAP ME 44】在 HANA DB中报废SFC时的SHOP_ORDER表记录锁定

症状 SELECT…FROM SHOP_ORDER FOR UPDATE 在 SFC 报废期间持有锁,当同时调用数量较大时,可能会导致 HANA 数据库出现大量锁积压。这有时会导致因等待 HANA 数据库释放“选择更新”锁而导致报废 SFC 花费数分钟。 HANA 数据库日志中的示例: # begin PreparedStatement_ex…

Vscode开发Vue项目NodeJs启动报错处理

文章目录 背景一、npm启动报错报错信息定位原因处理方案第一步、下载安装高版本 二、node 无法识别报错信息处理方案定位原因第一步、检测环境变量第二步、重新开启界面 背景 使用Vscode开发Vue项目,使用到NodeJs,记录出现的问题及处理方案,…

破局遗留系统!AI自动化重构:从静态方法到Spring Bean注入实战

在当今快速发展的软件行业中,许多企业都面临着 Java 遗留系统的维护和升级难题。这些老旧系统往往采用了大量静态方法,随着业务的不断发展,其局限性日益凸显。而飞算 JavaAI 作为一款强大的 AI 工具,为 Java 遗留系统的重构提供了全新的解决方案,能够实现从静态方法到 Spring B…

2025妈妈杯数学建模C题完整分析论文(共36页)(含模型建立、可运行代码、数据)

2025 年第十五届 MathorCup 数学建模C题完整分析论文 目录 摘 要 一、问题分析 二、问题重述 三、模型假设 四、 模型建立与求解 4.1问题1 4.1.1问题1思路分析 4.1.2问题1模型建立 4.1.3问题1代码(仅供参考) 4.1.4问题1求解结果(仅…

【Python爬虫详解】第一篇:Python爬虫入门指南

什么是网络爬虫? 网络爬虫(Web Crawler)是一种自动获取网页内容的程序。它可以访问网站,抓取页面内容,并从中提取有价值的数据。在信息爆炸的时代,爬虫技术可以帮助我们高效地收集、整理和分析互联网上的海…

【JavaWeb后端开发02】SpringBootWeb + Https协议

课程内容: SpringBootWeb 入门 Http协议 SpringBootWeb案例 分层解耦 文章目录 1. SpringBootWeb入门1.1 概述1.2 入门程序1.2.1 需求1.2.2 开发步骤1.2.3 常见问题 1.3 入门解析 2. HTTP协议2.1 HTTP概述2.1.1 介绍2.1.2 特点 2.2 HTTP请求协议2.2.1 介绍2.2.2…

MATLAB 控制系统设计与仿真 - 37

范数鲁棒控制器的设计 鲁棒控制器的设计 根据双端子状态方程对象模型结构,控制器设计的目标是找到一个控制器K(s),它能保证闭环系统的范数限制在一个给定的小整数下,即 这时控制器的状态方程为: 其中X与Y分别为下面两个代数Riccati方程的解…

依赖冲突,缺失插件导致无法启动项目 强制安装命令(npm install --legacy-peer-deps)

小白终成大白 文章目录 小白终成大白前言总结 前言 运维工程师说搞一个自动化打包流程 在服务器装了hbuilder 找前端来启动项目 我没启动起来 … 启动报错 failed to load config from D:\zhuque-uniapp\vite.config.js 16:17:31.601 error when starting dev server: 16:17:3…

数据战略新范式:从中台沉淀到服务觉醒,SQL2API 如何重塑数据价值链条?

一、数据中台退烧:从 “战略神话” 到 “现实拷问” 曾几何时,数据中台被视为企业数字化转型的 “万能解药”,承载着统一数据资产、打破业务壁垒的厚望。然而,大量实践暴露出其固有缺陷:某零售企业投入 500 万元建设中…

警惕阿里云中的yum update操作不当导致:/sbin/init被清空导致Linux无法正常启动

由于使用阿里云进行部署测试,因而会对yum update进行操作,这两天更新了systemd-239-82.0.3.4.al8.2.x86_64,但存在报错,然后进行yum history undo和清空yum cache,但出现操作Linux命令行无效。具体来说,几个…

论文阅读:2023 ICLR Safe RLHF: Safe Reinforcement Learning from Human Feedback

总目录 大模型安全相关研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 Safe RLHF: Safe Reinforcement Learning from Human Feedback 安全 RLHF:通过人类反馈进行安全强化学习 https://arxiv.org/pdf/2310.12773 https://github.com/PKU-Alignment/safe…

android rom打包解包工具,Android ROM定制:boot.img、recovery解包打包

安卓boot.img和recovery.img解析与修改指南 安卓映像文件结构解析 大家都知道安卓的核心更换是在boot.img里面,那么如何在Windows下解开它呢?这里介绍一个实用的方法。 首先需要获取bootimg.exe工具,这个工具最初是为华为设备开发的&#…

cdp-(Chrome DevTools Protocol) browserscan检测原理逆向分析

https://www.browserscan.net/zh/bot-detection 首先,打开devtools后访问网址,检测结果网页显示红色Robot,标签插入位置,确定断点位置可以hook该方法,也可以使用插件等方式找到这个位置,本篇不讨论. Robot标签是通过insertBefore插入的. 再往上追栈可以发现一个32长度数组,里面…

PostgreSQL 通过 copy 命令导入几何数据 及 通过 CopyManager.copyIn() 导入几何数据

COPY命令介绍 copy是postgresql提供的一个专门用于快速导入导出数据的命令,通常用于从文件(TXT、CSV等)或标准输入输出中读取或写入数据。适合批量导入导出数据,速度快。 默认情况下,如果在处理过程中遇到错误,COPY将失败。 COPY只能用于表,不能用于视图!!! COPY…

常用的几种 Vue 父子组件传值方式

1. 父组件向子组件传值(props) 父组件代码:Parent.vue <template><div><h2>父组件</h2><Child :parent-msg="parentMsg" /></div> </template><script> import Child from ./Child.vue;export default {componen…

【1】云原生,kubernetes 与 Docker 的关系

Kubernetes&#xff1f;K8s&#xff1f; Kubernetes经常被写作K8s。其中的数字8替代了K和s中的8个字母——这一点倒是方便了发推&#xff0c;也方便了像我这样懒惰的人。 什么是云原生&#xff1f; 云原生&#xff1a; 它是一种构建和运行应用程序的方法&#xff0c;它包含&am…

Eureka搭建

1.注册中心server端 1.1.引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency><groupId>org.springframework.cloud</…

2025年最新版动漫短剧系统开发小程序app教程,源码部署上线

以下是动漫短剧系统开发上线的详细教程&#xff0c;包含从0到1的全流程&#xff1a; 一、需求分析&#xff08;关键&#xff1a;明确核心功能&#xff09; 核心功能清单&#xff1a; 用户端&#xff1a;短视频浏览、弹幕评论、收藏/点赞、创作者关注、付费订阅。创作者端&am…