Diferença entre os parâmetros out e var no Delphi/Lazarus

Quando trabalhamos com Delphi ou Lazarus, é comum nos depararmos com parâmetros especiais em funções e procedimentos, como var e out. Embora ambos sejam usados para passar parâmetros por referência, cada um tem uma finalidade e um comportamento distinto. Neste post, vamos explorar essas diferenças e entender como e quando utilizá-los.
O que é o out?
O parâmetro out é usado para indicar que uma variável será usada exclusivamente para retornar valores de uma função ou procedimento. Quando uma variável é passada como out, ela não precisa estar inicializada antes da chamada, pois seu valor anterior será (ou deve ser) descartado. O compilador considera que a variável é “criada do zero” dentro do escopo do método.
Características do out:
- Exclusivo para saída: Ele é projetado para retornar dados, não para receber valores de entrada.
- Clareza de intenção: Indica explicitamente que o parâmetro será usado apenas como saída.
O que é o var?
O parâmetro var também é usado para passar variáveis por referência, mas ele permite tanto entrada quanto saída de valores. Quando uma variável é passada como var, seu valor atual é preservado e pode ser manipulado pela função ou procedimento.
Características do var:
- Mantém o valor inicial: O valor existente na variável é levado para a função.
- Entrada e saída: Pode ser usado tanto para fornecer valores quanto para retornar resultados.
- Maior flexibilidade: Adequado para cenários em que o valor inicial é importante.
Diferenças Entre out e var
A tabela a seguir resume as principais diferenças:
| Tipo de Parâmetro | Comportamento |
|---|---|
| Value (Entrada Apenas) | Passa uma cópia do valor. Alterações dentro do procedimento não afetam a variável original. |
| Out (Saída Apenas) | Ignora o valor inicial e exige que o procedimento defina um novo valor antes do uso. |
| Var (Entrada e Saída) | Preserva o valor inicial, permitindo leitura e escrita diretamente na variável original. |
Quando Usar out ou var?
- Use out quando:
- Você precisa retornar um valor exclusivamente.
- Não importa o valor inicial da variável.
- Use var quando:
- O valor inicial da variável é relevante.
- A variável precisa servir como entrada e saída.
Considere o seguinte exemplo do site https://www.delphibasics.co.uk/:
var
number1, number2, number3 : Integer;
begin
// Put values in our numbers
number1 := 3;
number2 := 4;
number3 := 5;
// Call the simple routine to see how they are handled
ThreeParms(number1, number2, number3);
// Show their values now
ShowMessageFmt('number1 = %d number2 = %d number3 = %d ',
[number1, number2, number3]);
end;
// Simple routine illustrating 3 types of parameter handling
// value1 : Input value only
// value2 : Output value only
// value3 : Input and output value
procedure TForm1.ThreeParms( value1: Integer;
Out value2: Integer;
var value3: Integer);
begin
// Add value1 to value 3 as the value2 output
value2 := value1 + value3;
// Multiply value1 by value3 to give value3 output
value3 := value1 * value3;
end;
Esse exemplo ilustra perfeitamente as diferenças práticas entre os tipos de parâmetros value, out e var em Delphi, além de como cada um é manipulado em diferentes cenários. Vamos detalhar o comportamento:
Inicialização
number1 := 3; // Valor inicial para o parâmetro por valor number2 := 4; // Valor inicial, mas será ignorado por "out" number3 := 5; // Valor inicial que será alterado por "var"
Os valores iniciais foram definidos para ilustrar como cada tipo de parâmetro trata esses dados.
Chamada do Procedimento
ThreeParms(number1, number2, number3);
Manipulação dos Parâmetros
value1(apenas entrada):- Esse parâmetro é passado por valor. O procedimento tem acesso a uma cópia do valor de
number1, mas qualquer alteração dentro do procedimento não afetará a variável original. - No caso,
value1mantém o valor3durante a execução.
- Esse parâmetro é passado por valor. O procedimento tem acesso a uma cópia do valor de
value2(apenas saída):- Esse parâmetro é passado como
out. O valor inicial denumber2é ignorado, e ele só terá um valor após ser definido explicitamente dentro do procedimento. - No código:
value2 := value1 + value3; - Resultado:
value2será3 + 5 = 8.
- Esse parâmetro é passado como
value3(entrada e saída):- Esse parâmetro é passado por
var. Ele preserva o valor original ao entrar no procedimento e pode ser alterado, com a alteração refletida na variável original. - No código:
value3 := value1 * value3; - Resultado:
value3será3 * 5 = 15.
- Esse parâmetro é passado por
Saída do Código
Ao exibir os valores após a chamada de ThreeParms, o resultado será:
number1 = 3 number2 = 8 number3 = 15
Resumo dos Comportamentos
value(entrada apenas): Cópia do valor é usada no procedimento, sem alterar o original.out(saída apenas): Ignora o valor inicial e deve ser definido dentro do procedimento antes de uso.var(entrada e saída): Permite leitura e escrita no valor original.
Conclusão
Tanto out quanto var são ferramentas poderosas para manipular variáveis por referência em Delphi e Lazarus. Compreender suas diferenças e aplicações ajuda a escrever códigos mais claros, eficientes e alinhados com a intenção do programa. Agora que você conhece esses conceitos, experimente aplicá-los em seus projetos e veja a diferença na qualidade do seu código!
E você, o que achou?
Essa explicação sobre os tipos de parâmetros em Delphi ajudou a esclarecer suas dúvidas?
Deixe sua opinião nos comentários!
Sua participação é muito importante para enriquecer a discussão e ajudar outros leitores.
Se tiver dúvidas, sugestões ou quiser compartilhar sua experiência, vamos conversar! 😊
💻 Compartilhe o post com outras pessoas se você achou ele relevante! 😊
📚 Obrigado por acompanhar até aqui! Explore outros posts relacionados no blog e continue evoluindo suas habilidades. Tem mais conteúdos sobre diversos assuntos te esperando! 👩💻 🔍✨
Até o próximo post. Valeu! 👋📖
#Delphi #Programação #DesenvolvimentoDeSoftware
#Lazarus #VarVsOut #DicasDeProgramação
#Desenvolvedores #CodandoMelhor #Tecnologia
#GiovaniDaCruz