Как работает ключевое слово в C # var?
Как работает ключевое слово в C # var?
Ответы:
Это означает, что тип объявляемого локального будет определен компилятором на основе его первого присваивания:
// This statement:
var foo = "bar";
// Is equivalent to this statement:
string foo = "bar";
Примечательно, varчто переменная не определяется как динамический тип. Так что это НЕ законно:
var foo = "bar";
foo = 1; // Compiler error, the foo variable holds strings, not ints
var имеет только два применения:
var foo = new { Bar = "bar" };Вы не можете использовать varв качестве типа ничего, кроме местных. Таким образом, вы не можете использовать ключевое слово varдля объявления типов полей / свойств / параметров / возвращаемых значений.
var foo = new Foo();это то же самое , как Foo foo = new Foo();, что означает , что fooможет содержать Fooссылку, или ссылку на объект любого Foo суб типа, а не в Foo супер тип.
Это означает, что тип данных является производным (подразумевается) из контекста.
С http://msdn.microsoft.com/en-us/library/bb383973.aspx
Начиная с Visual C # 3.0, переменные, объявленные в области метода, могут иметь неявный тип var. Неявно типизированная локальная переменная строго типизирована, как если бы вы сами объявили тип, но компилятор определяет тип. Следующие два объявления i функционально эквивалентны:
var i = 10; // implicitly typed
int i = 10; //explicitly typed
var полезно для устранения набора текста с клавиатуры и визуального шума, например,
MyReallyReallyLongClassName x = new MyReallyReallyLongClassName();
становится
var x = new MyReallyReallyLongClassName();
но им можно злоупотреблять до такой степени, что приносится в жертву удобочитаемость.
Он объявляет тип на основе того, что ему присвоено при инициализации.
Простой пример: код:
var i = 53;
Рассмотрим тип 53 и по существу перепишем его как:
int i = 53;
Обратите внимание, что пока мы можем иметь:
long i = 53;
Этого не произойдет с var. Хотя может с:
var i = 53l; // i is now a long
По аналогии:
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.
Это может быть незначительным удобством для сложных типов. С анонимными типами важнее:
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);
Здесь нет другого способа определения iи jиспользования, varпоскольку нет имени для типов, которые они содержат.
Вы когда-нибудь ненавидели писать такие инициализаторы переменных?
XmlSerializer xmlSerializer = new XmlSerialzer(typeof(int))
Итак, начиная с C # 3.0, вы можете заменить его на
var xmlSerializer = new XmlSerialzer(typeof(int))
Одно замечание: тип решается во время компиляции, поэтому проблем с производительностью нет. Но компилятор должен уметь определять тип на этапе сборки, поэтому такой код var xmlSerializer;вообще не компилируется.
int i = 100;// explicitly typed
var j = 100; // implicitly typed
var - это «контекстное ключевое слово» в C #, означающее, что вы можете использовать его только как локальную переменную неявно в контексте того же класса, в котором вы используете переменную. Если вы попытаетесь использовать его в классе, который вы вызываете из «Main» или другого внешнего класса, или, например, интерфейса, вы получите ошибку CS0825 < https://docs.microsoft.com/en-us/dotnet/ csharp / misc / cs0825 >
См. Примечания о том, когда его можно и нельзя использовать, в документации здесь: < https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/implicitly-typed -local-variables # примечания >
По сути, вы должны использовать это только тогда, когда вы объявляете переменную с неявным значением, например "var myValue =" This is the value "; Это экономит немного времени по сравнению, например, с" строкой ", но IMHO не так много времени сохранены и накладывают ограничение на масштабируемость вашего проекта.
var foo = new Foo(),fooможет быть типаFooили любого из его супер классов. Как это может быть законным?