Bufory o ustalonym rozmiarze (Przewodnik programowania w języku C#)Fixed Size Buffers (C# Programming Guide)

W języku C#, można użyć stałej instrukcję, aby utworzyć buforu z tablicą o stałym rozmiarze w strukturze danych.In C#, you can use the fixed statement to create a buffer with a fixed size array in a data structure. Bufory o ustalonym rozmiarze są przydatne, kiedy piszesz metod tego współdziałania ze źródłami danych z innych języków lub platform.Fixed size buffers are useful when you write methods that interop with data sources from other languages or platforms. Naprawiono tablicy może potrwać atrybuty ani modyfikatorów, których można używać do elementów członkowskich struktury regularne.The fixed array can take any attributes or modifiers that are allowed for regular struct members. Jedynym ograniczeniem jest to, że typ tablicy musi być bool, byte, char, short, int, long, sbyte, ushort, uint, ulong, float, lub double.The only restriction is that the array type must be bool, byte, char, short, int, long, sbyte, ushort, uint, ulong, float, or double.

private fixed char name[30];

UwagiRemarks

W kodzie bezpiecznym struktury języka C#, która zawiera tablicę nie zawiera elementów tablicy.In safe code, a C# struct that contains an array does not contain the array elements. Struktura zawiera odwołania do elementów.Instead, the struct contains a reference to the elements. Możesz osadzić tablicy o stałym rozmiarze w struktury gdy jest używany w niebezpieczne bloku kodu.You can embed an array of fixed size in a struct when it is used in an unsafe code block.

Następujące struct jest 8 bajtów.The following struct is 8 bytes in size. pathName Tablica jest odwołanie:The pathName array is a reference:

public struct PathArray
{
    public char[] pathName;
    private int reserved;
}

Element struct może zawierać osadzoną tablicę w niebezpieczny kod.A struct can contain an embedded array in unsafe code. W poniższym przykładzie fixedBuffer tablica ma stały rozmiar.In the following example, the fixedBuffer array has a fixed size. Możesz użyć fixed instrukcję, aby ustanowić wskaźnik do pierwszego elementu.You use a fixed statement to establish a pointer to the first element. Możesz uzyskać dostęp do elementów tablicy za pomocą tego wskaźnika.You access the elements of the array through this pointer. fixed Numerów PIN instrukcji fixedBuffer pola wystąpienia w określonej lokalizacji w pamięci.The fixed statement pins the fixedBuffer instance field to a specific location in memory.

internal unsafe struct MyBuffer
{
    public fixed char fixedBuffer[128];
}

internal unsafe class MyClass
{
    public MyBuffer myBuffer = default;
}

private static void AccessEmbeddedArray()
{
    MyClass myC = new MyClass();

    unsafe
    {
        // Pin the buffer to a fixed location in memory.
        fixed (char* charPtr = myC.myBuffer.fixedBuffer)
        {
            *charPtr = 'A';
        }
        // Access safely through the index:
        char c = myC.myBuffer.fixedBuffer[0];
        Console.WriteLine(c);
        // modify through the index:
        myC.myBuffer.fixedBuffer[0] = 'B';
        Console.WriteLine(myC.myBuffer.fixedBuffer[0]);
    }

}

Rozmiar elementu 128 char tablicy to 256 bajtów.The size of the 128 element char array is 256 bytes. Ustalony rozmiar char buforów zawsze pobierają dwóch bajtów na znak, niezależnie od tego, kodowania.Fixed size char buffers always take two bytes per character, regardless of the encoding. Ta zasada obowiązuje nawet po buforów char są wysyłane do metody interfejsu API lub struktury z CharSet = CharSet.Auto lub CharSet = CharSet.Ansi.This is true even when char buffers are marshaled to API methods or structs with CharSet = CharSet.Auto or CharSet = CharSet.Ansi. Aby uzyskać więcej informacji, zobacz CharSet.For more information, see CharSet.

W poprzednim przykładzie pokazano, uzyskiwanie dostępu do fixed bez przypinania, pola, których jest dostępna, począwszy od C# 7.3.The preceding example demonstrates accessing fixed fields without pinning, which is available starting with C# 7.3.

Innej wspólnej tablicy o stałym rozmiarze jest bool tablicy.Another common fixed-size array is the bool array. Elementy w bool tablicy są zawsze jednobajtowego w rozmiarze.The elements in a bool array are always one byte in size. bool tablice nie są odpowiednie do tworzenia tablic bitowe lub buforów.bool arrays are not appropriate for creating bit arrays or buffers.

Uwaga

Z wyjątkiem pamięci utworzone za pomocą stackalloc, kompilator języka C# i środowisko uruchomieniowe języka wspólnego (CLR) nie sprawdza zabezpieczeń buforu przepełnienia.Except for memory created by using stackalloc, the C# compiler and the common language runtime (CLR) do not perform any security buffer overrun checks. Podobnie jak w przypadku wszystkich niebezpieczny kod, należy zachować ostrożność.As with all unsafe code, use caution.

Niebezpieczne bufory różnią się od regularnych tablic w następujący sposób:Unsafe buffers differ from regular arrays in the following ways:

  • Niebezpieczne bufory można używać tylko w niebezpiecznym kontekście.You can only use unsafe buffers in an unsafe context.
  • Niebezpieczne bufory są zawsze wektorów lub tablic jednowymiarowych.Unsafe buffers are always vectors, or one-dimensional arrays.
  • Deklaracja tablicy powinna zawierać liczbę, takich jak char id[8].The declaration of the array should include a count, such as char id[8]. Nie można użyć char id[].You cannot use char id[].
  • Niebezpieczne bufory można tylko wystąpienia pól struktur w niebezpiecznym kontekście.Unsafe buffers can only be instance fields of structs in an unsafe context.

Zobacz takżeSee also