c# - 我怎样才能避免到处创建新的包装器对象?

标签 c# pointers reference wrapper intptr

我有各种包装 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。

关于c# - 我怎样才能避免到处创建新的包装器对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1968584/

相关文章:

javascript - 停留在一个简单的对象文字范围/引用问题上

c - 释放 char* 数据不起作用

c++ - 使用智能指针包装 C 创建和销毁函数

c++ - 如何将引用类型转换为值类型?

c# - 使 C# 应用程序组策略感知

c - Mac OSX 上指针的最大值是多少?

javascript - this.object.property = object.property 是通过引用或值传递的 Javascript;破坏垃圾收集器/内存泄漏

c# - 如何在 MVC 中实现自动完成文本框

c# - SQL 2005 MD5 哈希和 C# MD5 哈希

c# - UWP C# - 如何使用 Windows.Data.Json 将 JsonObject 反序列化为一个类?