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

 

posted @ 2022-03-23 17:37  keke..lele  阅读(142)  评论(0编辑  收藏  举报