编译器会丢弃空方法吗?
Does the compiler discard empty methods?
C# 编译器会优化空的 void 方法吗?
像
private void DoNothing()
{
}
本质上,除了将 DoNothing
添加到调用堆栈并再次删除它之外,没有代码是 运行,优化此调用不是更好吗?
Would C# compiler optimize empty void methods away?
没有。它们仍然可以通过反射访问,因此保留方法本身很重要。
任何调用站点也可能包含调用 - 但 JIT 可能会优化它们。它处于一个更好的位置来这样做。它基本上是内联的一种特殊情况,内联代码为空。
请注意,如果您在另一个对象上调用它:
foo.DoNothing();
那 不是 空操作,因为它会检查 foo
是否为非空。
从来没有。编译器与空的或未写入的内容无关。它就是你写的,你得到你的 MSIL。您可以在 ILDASM
中查看
如果你愿意,你可以拦截每个项目的 post 构建事件和 运行 一个 IL 检查工具,它将反映你生成的 dll,检查你的类型中的每个方法信息并请求它的 IL 外观对于只有 NoOp IL 指令的空 IL 模式,并删除不需要的方法。
例如:
var ilBytes = SomeMethodInfo.GetMethodBody().GetILAsByteArray();
A good obfuscation tool will "prune" methods in this way. preemptive.com/products/dotfuscator/features#pruning – weston 5 mins ago
您可以在 visual studio 外部使用该工具来查找空方法并将它们从定义或使用它们的文件中删除。
C# 编译器会优化空的 void 方法吗? 像
private void DoNothing()
{
}
本质上,除了将 DoNothing
添加到调用堆栈并再次删除它之外,没有代码是 运行,优化此调用不是更好吗?
Would C# compiler optimize empty void methods away?
没有。它们仍然可以通过反射访问,因此保留方法本身很重要。
任何调用站点也可能包含调用 - 但 JIT 可能会优化它们。它处于一个更好的位置来这样做。它基本上是内联的一种特殊情况,内联代码为空。
请注意,如果您在另一个对象上调用它:
foo.DoNothing();
那 不是 空操作,因为它会检查 foo
是否为非空。
从来没有。编译器与空的或未写入的内容无关。它就是你写的,你得到你的 MSIL。您可以在 ILDASM
中查看如果你愿意,你可以拦截每个项目的 post 构建事件和 运行 一个 IL 检查工具,它将反映你生成的 dll,检查你的类型中的每个方法信息并请求它的 IL 外观对于只有 NoOp IL 指令的空 IL 模式,并删除不需要的方法。
例如: var ilBytes = SomeMethodInfo.GetMethodBody().GetILAsByteArray();
A good obfuscation tool will "prune" methods in this way. preemptive.com/products/dotfuscator/features#pruning – weston 5 mins ago
您可以在 visual studio 外部使用该工具来查找空方法并将它们从定义或使用它们的文件中删除。