我有一个本地c++ DLL,它将许多指向数组的指针作为其参数,以及指示这些数组大小的整数。我在c#中调用它,就像这个刻意简化的例子;
unsafe
{
fixed (type1* thing1 = &arrayOfThing1[0])
{
fixed (type2* thing2 = &arrayOfThing2[0])
{
DllCallThatTakesLotsOfPointers(thing1, thing2);
}
}
}
有时数组可以为空,在这种情况下,只需传递一个空指针作为形参,并指定大小为0。"Just"至少在c++中。在c#中,使用这种类型的代码,如果其中一个数组是空的,那么fixed
块试图获取该地址会抛出空引用错误。
如果我能使用像
这样的东西就太好了fixed (type1* thing1 = arrayOfThing1==null? 0 : &arrayOfThing1[0])
但是这不能编译。
在google上找不到任何相关信息。我已经得到的东西使用一个可怕的bodge,我有属性检查null数组和返回所有不同类型的虚拟数组,和长度属性故意错误的行为,如果他们与虚拟数组一起使用。它很难阅读和维护。
有谁知道更好的处理方法吗?有许多数组可能被使用,也可能没有被使用,并且在类似的行上有几个不同的函数调用,因此有不同的嵌套"固定"每个组合的块不是一个可行的选择。
正如你在固定语句文档中看到的,
你可以将指针(例如thing1
)分配给数组本身(例如:arrayOfThing1
),而不是第一个元素的地址。地址仍然是你需要的第一个元素的地址。
例如:
int[] arrayOfThing1 = new int[10];
unsafe
{
fixed (int* thing1 = arrayOfThing1)
{
// here thing1 has a valid address
}
}
这会自动处理null
的情况:
int[] arrayOfThing1 = null;
unsafe
{
fixed (int* thing1 = arrayOfThing1)
{
// here thing1 is 0 (NULL)
}
}