Pilha de chamadas

Definição - o que significa Call Stack?

Uma pilha de chamadas, em C #, é a lista de nomes de métodos chamados em tempo de execução desde o início de um programa até a execução da instrução atual.

Uma pilha de chamadas tem como objetivo principal manter o controle do ponto ao qual cada sub-rotina ativa deve retornar o controle quando terminar de executar. A pilha de chamadas atua como uma ferramenta para depurar um aplicativo quando o método a ser rastreado pode ser chamado em mais de um contexto. Isso constitui uma alternativa melhor do que adicionar código de rastreamento a todos os métodos que chamam o método fornecido. Sempre que uma exceção é lançada em qualquer lugar no código do usuário, o Common Language Runtime (CLR) irá desenrolar a pilha de chamadas e procurar o bloco catch para determinar o tipo de exceção específico. Se não houver um manipulador apropriado, o CLR encerrará o aplicativo. A pilha de chamadas, portanto, é usada para informar ao ponteiro de execução para onde ir a seguir.

Definirtec explica Call Stack

A pilha de chamadas é organizada como "pilha", uma estrutura de dados na memória para armazenar itens na forma last-in-first-out, de modo que o chamador da sub-rotina empurre o endereço de retorno para a pilha e a sub-rotina chamada, após terminar, retira o endereço de retorno da pilha de chamadas para transferir o controle para esse endereço.

Em C #, qualquer aplicativo começa com um método "principal", que por sua vez chama outros métodos. Em cada chamada a um método, o método é adicionado ao topo da pilha e removido da pilha em seu retorno ao chamador. Além disso, o escopo de uma variável declarada em um bloco é determinado a partir do momento em que seu valor é colocado na pilha (como parte da pilha de chamadas) até a execução deixar o bloco quando a variável e a pilha de chamadas são retiradas da pilha. Assim, a pilha mantém as variáveis ​​locais (tipos de valor) e a pilha de chamadas (quadros de pilha), cujo tamanho indica a complexidade de um programa.

Esta definição foi escrita no contexto de C #