У 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 / різне / cs0825 >
Побачте зауваження про те, коли ви можете, а що не можете використовувати його, у документації тут: < https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/implicitly-typed -local-змінних # зауваження >
В основному, ви повинні використовувати це лише тоді, коли ви оголошуєте змінну з неявним значенням, таким як "var myValue =" Це значення "; Це економить трохи часу в порівнянні з вимовою" рядок ", наприклад, але IMHO не так багато часу збережено та обмежує масштабованість вашого проекту.
var foo = new Foo(),fooможе бути типуFooабо будь-якого з його супер класів. Як це може бути будь-яким законним?