Declaração fixo em C #
-
03-07-2019 - |
Pergunta
Temos um código semelhante ao seguinte em um dos nossos projetos. Alguém pode explicar (em Inglês simples) por que a declaração fixo é necessário aqui?
class TestClass
{
int iMyVariable;
static void Main()
{
TestClass oTestClass = new TestClass();
unsafe
{
fixed (int* p = &oTestClasst.iMyVariable)
{
*p = 9;
}
}
}
}
Solução
Ela corrige o ponteiro na memória. Lixo coletado línguas têm a liberdade para mover objetos de memória para a eficiência. Isso tudo é transparente para o programador, porque eles realmente não usar ponteiros no código CLR "normal". No entanto, quando você precisar de ponteiros, então você precisa corrigi-lo na memória se você quer trabalhar com eles.
Outras dicas
O fixo declaração vai "pin" a variável na memória para que o coletor de lixo não movê-lo na recolha. Se ele fez mover a variável, o ponteiro se tornaria inútil e quando você usou você estaria tentando acessar ou modificar algo que você não tinha a intenção de.
Você precisa em qualquer lugar que você faz a aritmética de ponteiro, para evitar que o coletor de lixo de movê-lo em você.
Uma vez que está em execução no modo inseguro (ponteiro), a instrução fixo alocar um espaço de memória específico para essa variável. Se você não colocou a instrução fixo, o coletor de lixo pode mover na memória a variável em qualquer lugar, quando ele quiser.
Espero que isso ajuda.
MSDN tem um exemplo muito similar. A declaração fixa, basicamente, blocos de coleta de lixo. Na Net, se você usar um ponteiro para uma localização de memória o tempo de execução pode realocar o objeto para um "melhor" localização a qualquer momento. Então, se você quer a memória de acesso diretamente você precisa corrigi-lo no lugar.