通用类型系统如何实现?

问题描述

我们知道 C# 程序或 VB 程序都会被编译成 IL 代码,如下图所示:

enter image description here

假设我们有一个 C# 程序和一个 VB 程序,它们都声明了一个整数,并且两个程序都被编译成汇编,下面是我的问题:

Q1- 根据 https://referencesource.microsoft.com/#mscorlib/system/int32.cs 我认为 Int32 是一种通用类型,对吗?

Q2-Int32类型在mscorlib.dll里面,是用C#实现的,所以可以说Common Type的源码都是C#实现的,后面会编译成dll

Q3-我正在读一本书,上面写着:

.NET Framework 包括框架类库 (FCL)。 FCL 是一组包含数千种类型定义的 DLL 程序集,其中每种类型都公开了一些功能

所以我可以说 mscorlib.dll 是 FCL 的一部分吗?

解决方法

  1. 是的,int/Int32 对所有语言都是通用的,并且是通用类型系统的一部分。在 C# 和 VB 语言的大部分内容中,它们之间没有明显区别。

但是,在 CIL 中,您不应混淆 Int32 struct 和 int,它们有些不同。

Int32 是定义了所有函数的结构体,用于定义字段、参数、变量等存储位置。

int 是 VES 堆栈上的 32 位整数表示,用于所有 8 位、16 位和 32 位基本整数类型,并且允许传输到定义为 {{ 1}}。

因此,在 C# 和 VB 中,您看不到它们之间的区别,这只是编译器在后台使用它们的方式。

  1. 不完全是。所有使用在 Int32 上声明的函数的代码,是的,将在 Int32 中编码。但是任何涉及简单 IL 字节码的内容都由编译器直接编码,因此 JIT 直接对其进行处理。

(警告:JIT 可能也会大量优化和内联 mscorlib 函数)。

  1. 是的,其中的一部分。在 .NET 的通常实现中,它是可以被引用的最基本的 DLL(意味着每个其他 DLL 都引用它)。人们通常说BCL:基类库,而不是 FCL。