如何在C#中永久修复变量?

Icy*_*now 0 .net c# winforms

在不安全的环境中,我知道通过使用该fixed语句,我可以获取并固定变量的地址,以便我可以安全地使用获取的指针.但是,有没有办法将此指针安全地存储在某处?如同,使该变量永久固定,直到指针本身被处理.

例如,如果我想要一个指向integer/ float/ 的指针double成为我的不安全类的成员,我该怎么办?

Mar*_*uła 10

固定内存的更永久的解决方案是使用GCHandle类,如下所示:

var handle = GCHandle.Create(myObject, GCHandleType.Pinned);
IntPtr address = handle.AddrOfPinnedObject();
//... use it
handle.Free();
Run Code Online (Sandbox Code Playgroud)

这允许您检索固定对象的地址并防止GC移动它.但是,GCHandle一旦完成,你必须保持活力并释放它.这比使用fixed()块更容易跨越许多方法甚至类.

值得注意的是,固定内存可能会损害您的性能,因为您正在GC努力工作.

如果你需要一块永远不会被移动的内存块,因为你正在使用它来与本机代码等进行交互操作,你可以考虑使用它Marshal.AllocHGlobal(),Marshal.FreeHGlobal()这样你就可以分配不会干扰的非可移动内存GC.