c# struct关键字深入
在我们看面试题的时候,经常会出现这样一个题目:
请描述struct与class的区别
那么,到底struct是什么呢?
菜鸟教程中这样描述:在 C# 中,结构体是值类型数据结构。它使得一个单一变量可以存储各种数据类型的相关数据
但是这样好像并不能完全理解struct到底是什么,为什么会出现这样的题目。为了说清楚这个题目,首先要了解一下值类型和引用类型的问题。所有的值类型都继承于 system.valuetype , 所有的引用类型都继承于 system.object
一切疑点定位到它声明的地方就可以清晰,所以我们还是反编译一下用证据说明一切:
声明如下的struct变量
public class SomeClassRef { public int x; } public struct SomeStructVal { public int x; }
然后我们看一下反编译后的内容
可以看到上图中,struct继承自valuetype,并且是一个sealed类。故而可以得出,abstract等关键字是不能出现在struct中的,且是不可以被继承的。那么,这样就可以总结出struct与class的区别:
1.struct是值类型,class是引用类型
2.struct是密封类,不可以被继承,同时也不可以有抽象方法、虚方法等 。class可以被继承,也可以存在抽象方法虚方法等
3.struct可以不用new 直接使用 例如下面代码,但是class不可以(这点为什么,暂时还不清楚实现原理)
SomeStructVal str; str.x = 1;
4.如下图,struct不能显示的声明无参构造函数,而类可以。
以上就是全部了,不过可以扩展答案,讲一下值类型与引用类型的区别,例如:
1.值类型struct 存储在栈上,引用类型class存储在堆上
2.作为参数传递时,值类型传递的是值,引用类型传递的是引用
3.值类型一般存储小对象,引用类型可以存储大对象
最后的最后,拓展一下值类型
我们一般情况讲值类型有哪几种的时候,会这样描述:int,double等数值类型,bool类型,enum ,struct。但其实看一下数值类型和bool类型的定义(如下图),可以知道这些也都是struct类型的。所以就很好的理解与记忆为什么这些是值类型的了
参考文档:https://blog.csdn.net/xxdddail/article/details/36862275