c# – 为什么最后调用GC.KeepAlive而不是在开头?

前端之家收集整理的这篇文章主要介绍了c# – 为什么最后调用GC.KeepAlive而不是在开头?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
参见英文答案 > Understanding garbage collection in .NET3个
GC.KeepAlive() on MSDN开始:

Code this method at the end,not the beginning,of the range of
instructions where obj must be available.

为什么会出现这种非直观的行为?

解决方法

因为从技术上讲,JIT和CLI可以确定在该点之后不使用该值,并认为该对象可用于收集.哎呀,编译器可以决定完全删除变量,并在上次使用后从堆栈中“弹出”它.

请注意,GC.KeepAlive实际上并没有做任何事情.这是一种不透明的无操作方法.关键在于,如果您使用对象作为参数调用不透明方法,则该对象仍然需要在周围,即可到达,即不可收集.

以下是KeepAlive的实现方式(删除了一些不感兴趣的属性):

[MethodImpl(MethodImplOptions.NoInlining)]
public static void KeepAlive(object obj)
{
}
原文链接:https://www.f2er.com/csharp/98316.html

猜你在找的C#相关文章