如果我将变量声明为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);
}
}
那我就不会有任何问题了。知道为什么会这样吗?编辑:真正令人困惑的是,为什么,如果我声明faceCgList
和alphaLevels
作为局部变量,问题就会消失?
Interop_Init和Interop_Run发生了什么?你正在传递两个成员alphaLevels和faceCgList到Interop_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类型,那么如果传入结构为非托管函数的引用,该结构将是直接传递给非托管函数,不需要中介非托管内存拷贝。