我试图弄清楚是否有办法在C#中做一些在C++中相当容易的事情.具体来说,如果我有一个数据数组,我可以创建一个指向该数据的指针,以便更方便地访问子部分.
例如,如果我有:
unsigned char buffer[1000];
Run Code Online (Sandbox Code Playgroud)
并且我确定在该阵列中的位置102到110处有一个字符串,我需要操作很多,我可以这样做:
unsigned char *strPtr = &buffer[102];
char firstChar = strPtr[0];
Run Code Online (Sandbox Code Playgroud)
这使我不必在后续操作中为每个数组索引添加"102".
虽然当你做这样的事情时我认识到不安全情况的可能性,但我想知道C#中是否存在一个道德等价物,它可以让我创建一个对现有数组子集的新引用.
就像是:
byte [8] newArray = &buffer[102];
Run Code Online (Sandbox Code Playgroud)
这个例子实际上没有用,或者我不会发布这个,但我认为它可以让我知道我想要实现的目标.
这个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];
Run Code Online (Sandbox Code Playgroud)
但是有一个建议是引入阵列切片.与ArraySegment一样,切片允许您创建视图到数组(不进行复制),并且可以用来代替实际数组.希望它能够成为(近)未来的C#版本.