Unity 6.3
0 онлайн 34 гостей 3 в системе
Вход

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! }