Що означає "var" у C #? [дублікат]


Відповіді:


159

Це означає, що тип оголошеного локалу буде визначений компілятором:

// 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 може бути визначений у методі лише як локальна змінна
  • Кілька vars не можуть бути оголошені та ініціалізовані в одній заяві. Наприклад, 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 / різне / cs0825 >

Побачте зауваження про те, коли ви можете, а що не можете використовувати його, у документації тут: < https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/implicitly-typed -local-змінних # зауваження >

В основному, ви повинні використовувати це лише тоді, коли ви оголошуєте змінну з неявним значенням, таким як "var myValue =" Це значення "; Це економить трохи часу в порівнянні з вимовою" рядок ", наприклад, але IMHO не так багато часу збережено та обмежує масштабованість вашого проекту.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.