Em C #, como funciona a palavra-chave var?
Em C #, como funciona a palavra-chave var?
Respostas:
Isso significa que o tipo de local que está sendo declarado será inferido pelo compilador:
// This statement:
var foo = "bar";
// Is equivalent to this statement:
string foo = "bar";
Notavelmente, varnão define uma variável como de tipo dinâmico. Portanto, isso NÃO é legal:
var foo = "bar";
foo = 1; // Compiler error, the foo variable holds strings, not ints
var tem apenas dois usos:
var foo = new { Bar = "bar" };Você não pode usar varcomo o tipo de nada além de locais. Portanto, você não pode usar a palavra var- chave para declarar tipos de campo / propriedade / parâmetro / retorno.
var foo = new Foo();é a mesma coisa que Foo foo = new Foo();, o que significa que foopode conter uma Fooreferência, ou uma referência a um objeto, qualquer Foo subtipo , não um Foo supertipo .
Isso significa que o tipo de dados é derivado (implícito) do contexto.
De http://msdn.microsoft.com/en-us/library/bb383973.aspx
A partir do Visual C # 3.0, as variáveis declaradas no escopo do método podem ter um tipo implícito var. Uma variável local digitada implicitamente é fortemente tipada como se você mesmo tivesse declarado o tipo, mas o compilador determina o tipo. As duas declarações a seguir de i são funcionalmente equivalentes:
var i = 10; // implicitly typed
int i = 10; //explicitly typed
var é útil para eliminar a digitação no teclado e ruído visual, por exemplo,
MyReallyReallyLongClassName x = new MyReallyReallyLongClassName();
torna-se
var x = new MyReallyReallyLongClassName();
mas pode ser usado demais a ponto de a legibilidade ser sacrificada.
Ele declara um tipo com base no que é atribuído a ele na inicialização.
Um exemplo simples é que o código:
var i = 53;
Examinará o tipo de 53 e essencialmente o reescreverá como:
int i = 53;
Observe que, embora possamos ter:
long i = 53;
Isso não acontecerá com var. Embora possa com:
var i = 53l; // i is now a long
Similarmente:
var i = null; // not allowed as type can't be inferred.
var j = (string) null; // allowed as the expression (string) null has both type and value.
Isso pode ser uma conveniência menor com tipos complicados. É mais importante com tipos anônimos:
var i = from x in SomeSource where x.Name.Length > 3 select new {x.ID, x.Name};
foreach(var j in i)
Console.WriteLine(j.ID.ToString() + ":" + j.Name);
Aqui não há outra maneira de definir ie jusar, varpois não há nome para os tipos que eles contêm.
Você já odiou escrever esses inicializadores de variáveis?
XmlSerializer xmlSerializer = new XmlSerialzer(typeof(int))
Portanto, começando com C # 3.0, você pode substituí-lo por
var xmlSerializer = new XmlSerialzer(typeof(int))
Um aviso: o tipo é resolvido durante a compilação, portanto, não há problemas com o desempenho. Mas o compilador deve ser capaz de detectar o tipo durante a etapa de construção, de forma que o código var xmlSerializer;não seja compilado.
int i = 100;// explicitly typed
var j = 100; // implicitly typed
var é uma "palavra-chave contextual" em C #, o que significa que você só pode usá-la como uma variável local implicitamente no contexto da mesma classe em que está usando a variável. Se você tentar usá-lo em uma classe que você chama de "Principal" ou alguma outra classe externa, ou uma interface, por exemplo, você obterá o erro CS0825 < https://docs.microsoft.com/en-us/dotnet/ csharp / misc / cs0825 >
Veja os comentários sobre quando você pode ou não usá-lo na documentação aqui: < https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/implicitly-typed -local-variables # remarks >
Basicamente, você só deve usar isso quando estiver declarando uma variável com um valor implícito, como "var myValue =" Este é o valor "; Isso economiza um pouco de tempo em comparação a dizer" string ", por exemplo, mas IMHO não é muito tempo salvo e restringe a escalabilidade do seu projeto.
var foo = new Foo(),foopoderia ser do tipoFooou qualquer de suas super classes. Como isso pode ser legal?