在C#中创建一个子数组引用(使用不安全?)

Wam*_*Wam 5 c# arrays unsafe multidimensional-array

我正在重构我们目前使用的库,我遇到了以下问题.

我们曾经有过以下的东西:

class Blah
{
    float[][] data;
    public float[] GetDataReference(int index)
    {
        return data[index];
    }
}
Run Code Online (Sandbox Code Playgroud)

由于各种原因,我已经用1维数组版本替换了这个锯齿状阵列版本,连接内部数组.我的问题是:我怎样才能返回对子数组的引用data

class Blah
{
    float[] data;
    int rows;

    public float[] GetDataReference(int index)
    {
        // Return a reference data from offset i to offset j;
    }
}
Run Code Online (Sandbox Code Playgroud)

我认为不安全和指针的东西可能有用,是否可行?

Jon*_*eet 10

不,你不能这样做 - 但你应该考虑使用ArraySegment.

请注意,数组对象包含有关其长度等的元数据,然后是数据本身.你不能创建一个现有数组的片段,并且仍然有数据旁边的元数据,如果你看到我的意思 - 必须有一个额外的间接级别(这是ArraySegment提供的).

(我有点惊讶的是,ArraySegment没有做更多的包装,例如通过实现IList<T>,但是我们去了.如果你愿意的话,很容易创建这样的结构.)

  • 可以与数组互换使用的ArraySegment类非常棒,但需要CLR支持.支持索引操作符,IEnumerable和扩展数组类型转换的ArraySegment和ReadonlyArraySegment结构也很不错.由于ArraySegment不支持任何东西,我不清楚它有什么好处. (2认同)