Visual Studio 2019提供了一项名为“在Visual Studio调试器中查看反汇编代码”的功能。但我想在Rider中使用“在调试器中查看反汇编代码”,而不是在Visual Studio 2019中使用。
这可行吗?
我找到了“IL View”,但那不是我想要的。
Visual Studio 2019提供了一项名为“在Visual Studio调试器中查看反汇编代码”的功能。但我想在Rider中使用“在调试器中查看反汇编代码”,而不是在Visual Studio 2019中使用。
这可行吗?
我找到了“IL View”,但那不是我想要的。
这是我如何验证一个封装了Int64的readonly struct的抽象成本确实为零,正如我所希望的:
上面的窗格显示了源代码,其中嵌套了一个for循环,该循环重复调用BT.ERezeptId上的静态方法,并将结果存储到数组中。
反编译窗格(左侧)显示编译器已将for循环有效地转换为等效的while循环。
我只在 IL 窗格(中间)上聚焦于内部循环,因为在 IL 中,循环设置和外部循环增加了许多无聊的行。本机代码窗格(右侧)显示编译器在优化 IL 时切除了相当多的废话。它有效地内联/扁平化了源代码级别上几层深的调用,从而消除了所有抽象成本。该代码的效率与处理裸露的 Int64
相同,而不是包装一个 Int64
的结构体。
这最明显的表现是,在源代码级别上调用的方法是 zufaellig()
,而在本机代码中调用的方法是 Zufallswert()
。实际上,编译器之所以在那一点停止内联,是因为我命令它这样做!
以下是被消除的抽象层级(全部驻留在一个引用程序集中,而不是当前源文件中):
public readonly partial struct ERezeptId
{
private readonly long m_Wert;
public ERezeptId (Ungeprueft<long> ungeprueft)
{
m_Wert = ungeprueft.Wert;
}
// ...
public static ERezeptId zufaellig (Random rng)
{
return new ERezeptId(new Ungeprueft<long>(Zufallswert(rng)));
}
[MethodImpl(MethodImplOptions.NoInlining)]
public static long Zufallswert (Random rng)
{
// ...
}
}
public readonly struct Ungeprueft<T>
{
public readonly T Wert;
public Ungeprueft (T wert)
{
Wert = wert;
}
}
Ungeprueft<>
(德语意为“未经检查”)是我的标准模板之一,它明确了参数验证被有意绕过的情况。