Buffers de tamanho fixo (Guia de Programação em 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 pré-existente ou COM projetos. Matriz fixed pode levar nenhum atributo ou modificadores que têm permissão 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
Nas primeiras versões 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 não seguros 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 em heap com:
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 fixa 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 é de 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 char 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 de tamanho. boolarrays não são adequados para a criação de matrizes de bits ou os buffers.
Dica
Com exceção de memória criada usando stackalloc, o compilador C# e o common language runtime (CLR) não executarem 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 dos arrays regulares das seguintes maneiras:
Você só pode usar buffers não seguros em um contexto.
Buffers inseguros são sempre vetores ou matrizes unidimensionais.
A declaração da matriz deve incluir uma contagem, tais como char id[8]. Não é possível usar char id[] em vez disso.
Buffers não seguros só podem ser campos de instância de estruturas em um contexto.
Consulte também
Referência
Código não seguro e ponteiros (Guia de Programação em C#)
Instrução fixed (Referência de C#)
Interoperabilidade (Guia de Programação em C#)