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

时间:2013-03-04 11:42:21

标签: c# .net winforms

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

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

1 个答案:

答案 0 :(得分:10)

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

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

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

值得注意的是,固定内存可能会损害您的性能,因为您正在使GC更加努力。

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