"fixed"关键字,其中包含可以为空的内容



我有一个本地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)
}
}

最新更新