C#核心(24)结构体和类的区别,抽象类和接口的区别(面试常问)
前言
随着上一节我们对StringBulider的讲解落下帷幕,c#核心的知识点我们也即将告一段落,我们讲完了面向对象要用的三大特性(封装,继承,多态)和七大原则。期中自然也不乏一些小的散的碎的的知识点。
今天我们要讲的也正如标题所说,是面试里经常用来开门拷打你的问题。
所以我们今天主要讲结论(为了帮助你更好的背诵来对付面试),至于为什么,或者说你想探究他的深层原理,那博主可能就爱能莫助了,我们今天在这里都只会进行很简单的探讨(因为博主水平还没那么厉害,足够厉害了再发一篇讲的更细的),大家主要记住结论。
自然,你想自己根据先前学的知识自己梳理一下也是可以的。
在这节,我们也会简单探讨一下使用的场景和情况,供大家参考。
结构体和类的区别
区别概述
- 结构体和类最大的区别在存储空间上,结构体是值类型,类是引用类型。
- 这意味着,结构体的存储空间在栈上,类的存储空间在堆上
- 结构体有封装,但是无继承和多态,也就是说不能使用protected
- 结构体的赋值不能为空,类可以。
细节区别
-
结构体成员变量申明指定初始值
-
结构体不能申明无参构造函数,析构函数
-
需要你进一步专研
结构体的特别之处
结构体可以继承接口,因为接口是行为的抽象,接口是一种只包含方法、属性、事件和索引器的抽象类型,定义了对象应有的行为。它们不依赖于特定的实现,因此结构体和类都可以实现相同的接口。
如何选择
- 用继承多态的场景选类
- 数据结合为对象优先结构体(类也可以,但是不建议)
- 值和引用类型的考虑
抽象类和接口的区别
相同点
-
都可以被继承
-
都不能直接实例化
-
都可以包含方法的申明
-
子类必须实现没有实现的方法
-
满足里氏替换原则
区别
-
抽象类中可以有构造函数 ,接口不行
-
抽象类是单一继承,但是接口可以继承多个
-
抽象类中可以有成员变量
-
抽象类中也可以申明方法
-
抽象类中有访问修饰符
选择
区别对象和行为的差距,然后在抽象类和接口中进行选择。这两个都是为了规范出现的东西,母的是帮助我们更好规范我们的编程行为。
总结
在本节中,我们深入探讨了 C# 中结构体和类以及抽象类和接口的相关知识,为应对面试提供关键结论。主要学习了以下要点:
- 结构体和类的区别
- 核心差异:结构体为值类型,存储于栈上;类是引用类型,存储在堆上。结构体仅有封装,无继承与多态,不能用 protected;类具备封装、继承和多态。结构体赋值不可为空,类则可以。
- 细节特性:结构体成员变量声明不能指定初始值,且无法声明无参构造函数和析构函数。不过,结构体能够继承接口,因其抽象行为不依赖特定实现,与类一样可实现相同接口。
- 应用场景:涉及继承多态时优先选类;将数据组合为对象,结构体是较好选择(类虽也能实现,但不推荐)。
- 抽象类和接口的区别
- 共同特性:二者均可被继承,不能直接实例化,可包含方法声明,子类必须实现未实现的方法,均遵循里氏替换原则。
- 不同之处:抽象类有构造函数,接口没有;抽象类是单一继承,接口可多重继承;抽象类可拥有成员变量、声明方法并设置访问修饰符。
- 选用准则:依据对象与行为的差异,在抽象类和接口间抉择,它们的存在旨在规范编程行为。
请期待我的下一篇博客!
期待您的关注与支持,感谢您对于佑梦游戏开发的关注!