如果我将变量声明为Public Members,而不是局部变量

本文关键字:局部变量 Members Public 变量 声明 如果 | 更新日期: 2023-09-27 18:15:12

我在一个类中有两个互操作数据结构作为私有成员,

public class RunInterop
{
        private AlphaShapeCg _alphaHandler;
        private DoubleCgList alphaLevels;
        private FaceCgList faceCgList;
    public RunInterop()
        {
            faceCgList =new FaceCgList();
            alphaLevels = new DoubleCgList();
            Interop_Init(ref _alphaHandler, ref faceCgList, ref alphaLevels);
           Interop_Run(ref _alphaHandler);
        }
}

现在的问题是,我将在Interop_Run线上得到System.AccessViolationException

但是,如果我以以下方式重写代码:

public class RunInterop
{
   private AlphaShapeCg _alphaHandler;
    public RunInterop()
        {
           var faceCgList =new FaceCgList();
           var alphaLevels = new DoubleCgList();
            Interop_Init(ref _alphaHandler, ref faceCgList, ref alphaLevels);
           Interop_Run(ref _alphaHandler);
        }
}
那我就不会有任何问题了。知道为什么会这样吗?

编辑:真正令人困惑的是,为什么,如果我声明faceCgListalphaLevels作为局部变量,问题就会消失?

如果我将变量声明为Public Members,而不是局部变量

Interop_InitInterop_Run发生了什么?你正在传递两个成员alphaLevelsfaceCgListInterop_Init -也许它保留了一些引用,在调用Interop_Run时再次使用,在这一点上,它可能看起来是访问不同类的私有成员?

编辑:只是一个想法:)

public class RunInterop
{
    private AlphaShapeCg _alphaHandler;
    private DoubleCgList _alphaLevels;
    private FaceCgList _faceCgList;
    public RunInterop()
    {
        AlphaShapeCg faceCgList = new FaceCgList();
        DoubleCgList alphaLevels = new DoubleCgList();
        Interop_Init(ref _alphaHandler, ref faceCgList, ref alphaLevels);
        Interop_Run(ref _alphaHandler);
        _alphaLevels = alphaLevels;
        _faceCgList = faceCgList;
    }
}

编辑:我发现了这个链接,解释了Mono中托管/非托管封送是如何工作的-我正在努力为微软的dotNET框架找到类似的信息文章,但我的猜测是它应该以类似的方式工作。以下是文章中的一段话:

另外,如果(a)结构位于堆栈上,并且(b)该结构只包含blittable类型,那么如果传入结构为非托管函数的引用,该结构将是直接传递给非托管函数,不需要中介非托管内存拷贝。