Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# &引用;使用;来自单个函数的多个IDisPobles_C#_Pointers - Fatal编程技术网

C# &引用;使用;来自单个函数的多个IDisPobles

C# &引用;使用;来自单个函数的多个IDisPobles,c#,pointers,C#,Pointers,我有一个方法返回结构AStruct的NativeList,其中NativeList是非托管内存上的包装器,它实现了IDisposable。AStruct包含另一个指针,后面有一个NativeList,它也是用相同的方法创建的,因此: private unsafe NativeList<AStruct> GetAStructs() { var floatList = new NativeList<float>(); floatList.Add(0.0f);

我有一个方法返回结构
AStruct
NativeList
,其中
NativeList
是非托管内存上的包装器,它实现了
IDisposable
。AStruct包含另一个指针,后面有一个
NativeList
,它也是用相同的方法创建的,因此:

private unsafe NativeList<AStruct> GetAStructs()
{
    var floatList = new NativeList<float>();
    floatList.Add(0.0f);

    var list = new NativeList<AStruct>();

    AStruct a1 = new AStruct();
    a1.floats = (float*)floatList.Data;
    list.Add(a1);

    // ...

    return list;
}
我这样称呼它

using (NativeList<AStruct> disposableList = GetAStructs(out IDisposable toDispose))
using (toDispose)
{
    callNativeFunction((AStruct*)disposableList.Data);
}
使用(NativeList disposableList=GetAStructs(out-IDisposable-to-dispose))
使用(toDispose)
{
callNativeFunction((AStruct*)disposableList.Data);
}

这会按预期工作吗?有没有一种方法可以在不向调用方法公开实现细节的情况下做到这一点?

我承认我对NativeArray不太了解,但在这种情况下,您通常可以通过创建正在使用的类的子类来获得所需的功能

在本例中,我建议您创建一个子类
NativeList
,其中包含一个回调以供处理。向它传递一个函数,该函数将完成您之前要求调用方完成的工作

示例子类:

class MyNativeList<T> : NativeList<T>
{
    protected readonly Action _callAfterDisposal;

    public MyNativeList(Action callAfterDisposal) : base()
    {
        _callAfterDisposal= callAfterDisposal;
    }

    public override Dispose()
    {
        base.Dispose();
        _callAfterDisposal();
    }
}

请注意,
GetAStructs()
仍然返回对
NativeList
(而不是
MyNativeList
)的引用,因此实现细节不会泄漏给调用方,除非调用方特意转换结果。

如果
NativeList
已经实现了
IDisposable
,为什么不让它处理资源的处置?如果不想公开这种实现细节,需要让
NativeList
拥有
NativeList
(即,NativeList将保留对它所依赖的NativeList的私有引用,并且必须处理它。这意味着您必须更改NativeList的实现以支持此操作。我不希望在调用本机函数之前处理
floatList
,而
AStru的第一个
NativeList
)ct
s只包含一个指向数据的指针。我没有访问
NativeList
的实现的权限。好的,那么不要让GetAStructs返回NativeList。创建一个IDisposable类,该类将包含两个NativeList(并负责它们的处理),这应该是GetAStructs的返回类型。
class MyNativeList<T> : NativeList<T>
{
    protected readonly Action _callAfterDisposal;

    public MyNativeList(Action callAfterDisposal) : base()
    {
        _callAfterDisposal= callAfterDisposal;
    }

    public override Dispose()
    {
        base.Dispose();
        _callAfterDisposal();
    }
}
private unsafe NativeList<AStruct> GetAStructs()
{
    var floatList = new NativeList<float>();
    floatList.Add(0.0f);

    //here we construct the MyNativeList and pass it an action to execute when it is disposed
    var list = new MyNativeList<AStruct>( () => {
        callNativeFunction((AStruct*)floatList.Data);
        floatList.Dispose();
    });

    AStruct a1 = new AStruct();
    a1.floats = (float*)floatList.Data;
    list.Add(a1);

    // ...

    return list;
}
using ( var disposableList = GetAStructs() ) 
{
    //Do stuff
}