Buffers de tamanho fixo (guia de programação de C#)
No C#, você pode usar o fixa a instrução para criar um buffer com uma matriz de tamanho fixo em uma estrutura de dados. Isso é útil quando você estiver trabalhando com o código existente, como, por exemplo, códigos escritos em outras linguagens, DLLs preexistentes ou COM projetos. Pode levar a matriz fixed quaisquer atributos ou modificadores são permitidas para membros de struct regular. 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];
Comentários
Em versões anteriores do C#, declarar uma estrutura de tamanho fixo de estilo C++ era difícil porque uma struct C# contém uma matriz não contém os elementos da matriz. Em vez disso, a estrutura contém uma referência aos elementos.
C# 2.0 adicionou a capacidade de incorporar uma matriz de tamanho fixo em um struct quando ele é usado em um inseguros bloco de código.
Por exemplo, antes de C# 2.0, o seguinte struct seria 8 bytes de tamanho. O pathName matriz é uma referência para o array alocada da heap:
public struct MyArray
{
public char[] pathName;
private int reserved;
}
Começando com o C# 2.0, um struct pode conter uma matriz incorporada. No exemplo a seguir, o fixedBuffer matriz tem um tamanho fixo. Para acessar os elementos da matriz, você usar um fixed a instrução para estabelecer um ponteiro para o primeiro elemento. O fixed instrução pinos de uma instância de fixedBuffer para um local específico na memória.
namespace FixedSizeBuffers
{
internal unsafe struct MyBuffer
{
public fixed char fixedBuffer[128];
}
internal unsafe class MyClass
{
public MyBuffer myBuffer = default(MyBuffer);
}
internal class Program
{
static void Main()
{
MyClass myC = new MyClass();
unsafe
{
// Pin the buffer to a fixed location in memory.
fixed (char* charPtr = myC.myBuffer.fixedBuffer)
{
*charPtr = 'A';
}
}
}
}
}
O tamanho do elemento 128 char matriz é 256 bytes. Fixa o tamanho char buffers terão sempre dois bytes por caractere, independentemente da codificação. Isso é verdadeiro mesmo quando os buffers de caracteres são empacotados para métodos de API ou estruturas com CharSet = CharSet.Auto ou CharSet = CharSet.Ansi. Para obter mais informações, consulte CharSet.
Outra matriz de tamanho fixo comum é o bool array. Os elementos em um bool matriz são sempre um byte no tamanho. boolarrays não são apropriados para a criação de matrizes de bits ou buffers.
Observação |
---|
Com exceção de memória criada usando stackalloc, o compilador C# e o common language runtime (CLR) não executar nenhuma verificação de saturação do buffer de segurança. Assim como acontece com todo o código não seguro, tome cuidado. |
Buffers inseguros diferem de arrays regulares das seguintes maneiras:
Você só pode usar buffers não seguros em um contexto sem segurança.
Buffers inseguros são sempre vetores ou matrizes unidimensionais.
A declaração da matriz deve incluir uma contagem, como char id[8]. Não é possível usar char id[] em vez disso.
Buffers inseguros só podem ser campos de instância de estruturas em um contexto sem segurança.
Consulte também
Referência
Unsafe Code and Pointers (C# Programming Guide)
fixed Statement (C# Reference)
Interoperability (C# Programming Guide)