值类型可以存储在线程的堆栈中,IL在执行堆栈中运行(抽象概念)。
int y=0;
int a=0;
int b=0;
int x = y + (a - b);
IL_0001: ldc.i4.0
IL_0002: stloc.0 // y
IL_0003: ldc.i4.0
IL_0004: stloc.1 // a
IL_0005: ldc.i4.0
IL_0006: stloc.2 // b
IL_0007: ldloc.0 // y
IL_0008: ldloc.1 // a
IL_0009: ldl
IL2CPP是一个统一开发的脚本后端,您可以在为某些平台构建项目时使用它作为Mono的替代。注意-只有在为下列平台构建时才能使用IL2CPP:
安卓AppleTV,iOS*,任天堂3DS,任天堂开关,Playstation 4 Playstation Vita,WebGL*,Windows,Xbox One
我有一个项目(团结5.2),它已经切换到Android部署。我试图将支持的脚本从Mono2x切换到IL2CPP,它向我展示了
Andriod上的IL2CPP是实验性的,不受支持
因此,我的简单问题是,如果仍然不支持它,那么为什么该选项包括在内,IL2CPP和Mono2x之间的根本区别是什么
为什么在CIL中,编译器在使用数组时将foreach循环转换为for循环,而在使用List<T>时则使用迭代器模式?
如果System.Array和System.Collections.Generic.List<T>都实现了IEnumerable,那么它们不应该都在幕后使用迭代器模式吗?
下面是一个示例:
控制台App1:
C#:
class Program
{
static void Main(string[] args)
{
var enumerable = new List<string> { "a",
如果您被隐藏起来,C#中的值类型将被编译器/CLR特别处理。但是CLR内部的类型被更特别地对待。我的意思是:
int a = 5;
int b = 10;
int с = a + b;
a.CompareTo(b);
您可以在Visual中用鼠标在int上悬停,并看到它实际上是System.Int32结构。没关系。现在,您可以获取ILDasm并查看System.Int32是什么:通过一个类型为int32的字段(这是CLR内部的int32 )来切换它是非常简单的结构,并且没有重载操作符供添加。
那么,这个int с = a + b是如何工作的呢?再次,我抓住ILDasm和调查IL。原来IL代码中