index | 元素的索引。 |
T 一个 ref readonly
,指向类型为 T
的值。
通过索引提供对 ReadOnly 元素的只读访问。
此方法很危险,因为它返回对可以被销毁的内存的引用(例如,使用 Dispose),如果访问 ref local
,可能会导致未定义的结果,包括崩溃。
public readonly struct BigStruct { public readonly long a; public readonly long b; public readonly long c; public readonly long d; }
static void ProcessByte(byte b) { ... }
static void ProcessBigStructWithoutCopy(in BigStruct bigStruct) // see 'in' modificator { ... }
static void Example() { const int n = 32;
var nativeArrayOfBytes = new NativeArray<byte>(n, Allocator.Temp); var nativeArrayOfBigStructures = new NativeArray<FixedString4096Bytes>(n, Allocator.Temp);
// ... fill the arrays with some data ...
var readOnlyBytes = nativeArrayOfBytes.AsReadOnly(); for (var i = 0; i < n; ++i) { ProcessByte(readOnlyBytes[i]); //ProcessByte(readOnlyBytes.UnsafeElementAt(i)); is more expensive, since pointer on x64 platforms is 8 times bigger than a byte }
var readOnlyBigStructures = nativeArrayOfBigStructures.AsReadOnly(); for (var i = 0; i < n; ++i) { //ProcessBigStructWithoutCopy(readOnlyBigStructures[i]); copy - expensive in this case ProcessBigStructWithoutCopy(readOnlyBigStructures.UnsafeElementAt(i)); }
// dangerous part ref var element = ref readOnlyBigStructures.UnsafeElementAt(4);
// element is valid here ProcessBigStructWithoutCopy(element);
nativeArrayOfBigStructures.Dispose();
// access to element here is undefined, can lead to a crash or wrong results // ProcessBigStructWithoutCopy(element); <-- do not do this! }