Что означает «var» в C #? [дубликат]


Ответы:


161

Это означает, что тип объявляемого локального будет определен компилятором на основе его первого присваивания:

// 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 имеет только два применения:

  1. Для объявления переменных требуется меньше набора текста, особенно при объявлении переменной как вложенного универсального типа.
  2. Его необходимо использовать при хранении ссылки на объект анонимного типа, потому что имя типа не может быть известно заранее: var foo = new { Bar = "bar" };

Вы не можете использовать varв качестве типа ничего, кроме местных. Таким образом, вы не можете использовать ключевое слово varдля объявления типов полей / свойств / параметров / возвращаемых значений.


@cdhowie Что делать , если, говоря, var foo = new Foo(), fooможет быть типа Fooили любого из его супер классов. Как это может быть законным?
— Джон Строуд

3
@Djack Это незаконно, и это не так. var foo = new Foo();это то же самое , как Foo foo = new Foo();, что означает , что fooможет содержать Fooссылку, или ссылку на объект любого Foo суб типа, а не в Foo супер тип.
— cdhowie

15

Это означает, что тип данных является производным (подразумевается) из контекста.

С 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();

но им можно злоупотреблять до такой степени, что приносится в жертву удобочитаемость.


9

«var» означает, что компилятор определит явный тип переменной на основе использования. Например,

var myVar = new Connection();

предоставит вам переменную типа Connection.


7

Он объявляет тип на основе того, что ему присвоено при инициализации.

Простой пример: код:

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поскольку нет имени для типов, которые они содержат.


5

Вы когда-нибудь ненавидели писать такие инициализаторы переменных?

XmlSerializer xmlSerializer = new XmlSerialzer(typeof(int))

Итак, начиная с C # 3.0, вы можете заменить его на

var xmlSerializer = new XmlSerialzer(typeof(int))

Одно замечание: тип решается во время компиляции, поэтому проблем с производительностью нет. Но компилятор должен уметь определять тип на этапе сборки, поэтому такой код var xmlSerializer;вообще не компилируется.


0
  • Как следует из названия, var - это переменная без какого-либо типа данных.
  • Если вы не знаете, какой тип данных будет возвращен каким-либо методом, в таких случаях можно использовать var.
  • var - это неявный тип, что означает, что система сама определит тип данных. Компилятор определит его тип на основе значения справа от оператора «=».
  • int / string и т. д. являются явными типами, поскольку они явно определены вами.
  • Var может быть определен в методе только как локальная переменная
  • Несколько переменных не могут быть объявлены и инициализированы в одном операторе. Например, var i = 1, j = 2; является недействительным.
int i = 100;// explicitly typed 
var j = 100; // implicitly typed

0

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 не так много времени сохранены и накладывают ограничение на масштабируемость вашего проекта.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.