我试图找出在C#中做某事的方法,这在C ++中很容易做到。具体来说,如果我有一个数据数组,我可以创建一个指向该数据的指针,以便更方便地访问子部分。
例如,如果我有:
unsigned char buffer[1000];
我确定在该阵列中的位置102到110处有一个字符串,我需要操作很多,我可以这样做:
unsigned char *strPtr = &buffer[102];
char firstChar = strPtr[0];
这使我不必添加" 102"在后续操作中对每个数组索引。
虽然当你做这样的事情时我发现了不安全情况的可能性,但我想知道C#中是否存在道德上的等同物,它可以让我创建对现有数组子集的新引用。
类似的东西:
byte [8] newArray = &buffer[102];
这个例子实际上并不起作用,或者我不会发布这个,但我认为它可以让我知道我想要实现的目标。
答案 0 :(得分:5)
ArraySegment<T>
类可以用作访问数组段的包装器。只需提供数组,偏移量和段的长度,您就可以使用它,就好像它是实际的数组一样。您将获得使用数组的检查和其他细节。
var buffer = new byte[1000];
var newArray = new ArraySegment<byte>(buffer, 102, 8) as IList<byte> // we have an "array" of byte[8]
var firstChar = newArray[0];
然而,有proposal引入数组切片。与ArraySegment一样,切片允许您创建视图到数组(不进行复制),并且可以用来代替实际数组。希望它能够成为(近)未来的C#版本。