我有各种包装 IntPtr
的类。它们不存储自己的数据(指针除外),而是使用属性和方法使用非托管库在指针处公开数据。它运行良好,但我已经到了需要能够从其他包装对象引用这些包装对象的地步。例如:
public class Node {
private IntPtr _ptr;
public Node Parent {
get { return new Node(UnmanagedApi.GetParent(_ptr)); }
}
internal Node(IntPtr ptr) {
_ptr = ptr;
}
}
现在,我可以简单地返回一个 new Node(parentPtr)
(如上),但是有可能有数万个节点。这不是一个坏主意吗,因为多个包装器对象可能最终引用相同的 IntPtr
?
我该怎么做才能解决这个问题?我考虑过使用静态 KeyedCollection
类,它使用每个 IntPtr
作为键。因此,我不必每次都返回一个新的 Node
,我可以直接查找它。但这会带来线程问题,对吧?
有没有更好的办法?
我能看到的最大问题是谁负责删除指针引用的对象?
重复使用同一对象不一定是线程问题,但如果您负责对非托管对象调用 delete,则需要在您的对象中实现某种引用计数。
如果您的对象是只读的,则使用具有相同指针的多个对象可能会更容易。如果它们具有可以更改的状态,那么您将需要了解在多个对象持有指向该状态的指针时进行更改的影响。
您可能还想查看 C++/CLI(托管 C++)以在 C# 和非托管库之间提供一个层,并在其中进行翻译/操作的艰苦工作,并为 C# 提供更简单的 API。
我是一名优秀的程序员,十分优秀!