150得票1回答
为什么C#编译器将"!="翻译成">"?

我偶然发现C#编译器将这个方法转换为:static bool IsNotNull(object obj) { return obj != null; } …转换为这个CIL:.method private hidebysig static bool IsNotNull(object o...

8得票3回答
IL和参数

IL中有一些操作码用于处理参数,例如Ldarg.0、Ldarg.1等。 我知道在执行call操作码之前,这些参数被推送到堆栈上,在某些情况下使用Ldarg.0来获取this的引用(例如成员)。 我的问题是:当调用被初始化时,这些参数存储在哪里?在执行的调用中,调用者的堆栈副本是否可访问? ...

9得票2回答
为什么编译器会添加一个不必要的局部变量?

这段C#代码: private void LoadAssignments(AssignmentType assignmentType, Collection<Assignment> assignments) { bool flag; Dat...

8得票2回答
IL中的while循环-为什么需要stloc.0和ldloc.0?

我正在尝试理解IL中的while循环是怎样的。我已经编写了以下C#函数: static void Brackets() { while (memory[pointer] > 0) { // Snipped body...

10得票2回答
MSIL指令是否具有原子性?

我正在使用MSIL反编译器-ILDASM进行一些实验,并尝试反编译一个简单的.NET方法。 操作码看起来大致如下:.method private hidebysig static int32 Add(int32 a, ...

11得票4回答
CIL堆栈交换指令

有没有一个CIL指令可以交换堆栈中的前两个元素?

31得票3回答
C#编译器不会优化不必要的类型转换。

几天前,在stackoverflow上为这个问题写答案时,我对C#编译器感到有点惊讶,因为它没有按照我预期的那样工作。请看以下两段代码: 第一段:object[] array = new object[1]; for (int i = 0; i < 100000; i++) { ...

82得票18回答
CIL nop操作码的目的是什么?

我正在查看MSIL并注意到有很多nop指令。 MSDN文章说它们不执行任何操作,并且如果需要修补,它们用于填充空间。在调试版本中使用得比发布版要多。 我知道这些语句在汇编语言中用于对齐后面的指令,但为什么MSIL需要使用nop指令呢? (编辑说明:被接受的答案是关于机器码NOP而不是最初...

7得票4回答
为什么.NET代码编译成MSIL?

.NET代码首先编译为MSIL,然后JIT将其转换为机器相关的代码。有人能告诉我进行两步编译会带来哪些好处吗?谢谢。

7得票2回答
在IL代码中,为什么在某些情况下不会出现nop操作码?为什么在某些情况下会出现br.s操作码?

假设我有以下代码: 假设我有以下代码: public class Class1 { private Class2 obj; public void MethodA() { var class2 = new Class2(); clas...