NativeArray<T0>.UnsafeElementAt
Declaration
public ref readonly T UnsafeElementAt(int index);Параметры
| Параметр | Описание |
|---|---|
| индекс | Индекс элемента. |
Возвращаемое значение
T A 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!
}