TransWikia.com

Diferenças entre declarações de variáveis em C#

Stack Overflow em Português Asked by Rodolpho Chagas on November 25, 2021

Qual a diferença entre essas declarações:

Classex xx = new Classex();
var xx = new Classex();
Classex xx;

Se no final consigo usar tudo da mesma forma (métodos, propriedades…)

Ex.:

Eu crio uma lista: List<Classex> lstx = new List<Classex>();

Adiciono alguns valores: lstx.Add(...)

Depois quero pegar alguns valores dessa lista e inserir em outra, qual a melhor maneira de se fazer:

var lstx_filtrada = new List<Classex>;,
List<Classex> lstx_filtrada= new List<Classex>;
List<Classex> lstx_filtrada;

2 Answers

A diferença é:

1º Caso

Classex xx = new Classex();

Você criou uma variável xx do tipo Classex que já foi inicializada com uma nova instância de Classex.

2º Caso

var xx = new Classex();

A mesma coisa do anterior, só que quando você declarou var você atribuiu ao compilador a responsabilidade de 'descobrir' qual é o tipo de xx, como já esclarecido na pergunta e resposta referenciada.

Tecnicamente as duas declarações são iguais, mas uma delas (a que usa o var) é uma forma simplificada de codificar. Se a variável está sendo criada naquele momento e já recebendo o seu valor o compilador infere que o tipo dela será o mesmo tipo do objeto que ela está recebendo.

3º Caso

Classex xx;

Como no primeiro, você especificou explicitamente o tipo da variável. Mas, em qualquer tentativa de uso sem uma inicialização resultará em erro (em alguns casos de compilação inclusive), como já explicado na resposta do Maniero.

Answered by Diego Rafael Souza on November 25, 2021

Sobre o uso do var ou o tipo explicitamente já foi em respondi em Quando usar var em C#?, por este motivo acho desnecessário postar aqui os dois primeiros exemplos.

A terceira opção você não consegue usar da mesma forma, se tentar usar o objeto uma exceção NullReferenceException será lançada porque não há um objeto instanciado para a variável. Só poderá ser usado se mais pra frente inicializar o objeto de alguma forma. Sem um objeto formado qualquer acesso a um membro da instância falhará porque não tem nada para acessar. Note que o acesso aos membros da classe (portanto os estáticos) é possível porque não depende de instância.

Em C# 8 passa ser proibida essa forma de declaração, a não ser que mantenha desligado a verificação de objeto nulo, ou declare assim:

Classex? xx;

Coloquei no GitHub para referência futura.

Answered by Maniero on November 25, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP