c#

位置:IT落伍者 >> c# >> 浏览文章

浅谈C#中所谓的 “值类型”


发布日期:2023年03月18日
 
浅谈C#中所谓的 “值类型”

在C#中相信大家对于 值类型 并不陌生因为它在我们代码设计中是不可缺少的那么究竟什么是 值类型 呢? 值类型 就是 我们用到的 IntInt这些数值类型吗?

我们知道在C#中所有的类型继承于SystemObject根类型这也就意味着就代码层面来讲在C#中所有的类型都是Class即一切都是Class类型既然全部都是Class类型那么值类型在哪里呢?我们可以发现在C#中SystemIntSystemIntSystemBoolean等等这些常用的类型都是Struct 结构类型那么结构类型是什么下面我们定义一个结构然后通过IL Disassemble 工具来查看编译的中间代码便可以得到结果

public struct CustomerStruct

{

public string Name{get;set;}

}

代码非常简单我们就定义一个struct类型并且包含一个Name属性

看到上面这幅图相信大家都已经看到定义一个struct类型实际上编译把你所定义的类型继承了SystemValueType类型换句话说在C#中我们经常使用的SystemIntSystemIntSystemBoolean这些数值结构类型都是继承于SystemValueType类型而SystemValueType又是继承于SystemObject根类型即验证我开始所讲到的在C#中一切类型都是Class

之所以存在值类型 这个概念其实是因为C#中的某些类型有这特殊的地位(即继承于SystemValueType的类型)CLR会特殊的对待这些类型

看下面这行代码

Int a = new SystemInt() ;

CustomerStruct customer = new CustomerStruct() ;

首先为什么对于数值类型也可以使用 new 来进行内存分配呢? 上面已经讲到因为他们都是Class类型当然可以使用new 来进行内存分配

其次CLR执行这样的代码的时CLR 通过反射(有待考察)或者其他途径来获知所要请求分配内存的类型是否继承于SystemValueType如果是的话那么就在栈上进行分配如果不是的话那么就是我们所说的引用类型就在托管堆上分配内存以及栈上分配对应的引用变量这些一切都是CLR做的工作

我们再来看看装箱操作

object o = new object();

Int aaa = ;

o = aaa; //这里会发生装箱操作

我们都知道当CLR执行到 o = aaa;这条语句时会发生装箱操作为什么会发生装箱操作呢?这是因为CLR 知道引用变量o所要引用的类型aaa是继承于SystemValueType类型的继承于SystemValueType的类型都是在栈上分配的而其它则是在托管堆上分配的所以会CLR会弄得aaa的副本弄到托管堆上去这一切也都是CLR的工作

由此我们可以得出结论:

在C#中 就代码层面上讲 所有的类型都是Class类型

所谓的 值类型 != 数值类型而是所有继承于SystemValueType 的类型

值类型 得到的语言级别的支持CLR知道如何对 值类型 这样的Class类型进行内存分配和处理

综上所述个人愚见有什么不对的地方希望大家帮忙指出共同学习共同进步

上一篇:C#开发ActiveX控件操作指南

下一篇:动态执行C#代码