Изучая Entity Framework натолкнулся на интересную вещь :
Для создания запроса мы можем использовать var :
var phones = db.Phones.Where(p=> p.Company.Name=="Samsung");
либо явно указывая тип запроса ,например :
Phone myphone = db.Phones.Where(p=> p.Company.Name=="Samsung");
что меня натолкнуло на интересный вопрос :
А можно ли при разработке использовать при создании переменных в большинстве случаев var вместо явного указания типа?Если нет, то почему нежелательно?
А теперь наведу несколько примеров ,в которых указаны различия между использованием var явным указанием типов,почему мне кажется что все-таки var в большинстве случаев будет юзабельней и читабельней для разработчиков :
1) Для объявления и дальнейшего использования таких структур как списки и словари(к примеру) которые имеют в себе уже вложенные типы:
Dictionary<Dictionary<String, String>, String> items = new Dictionary<Dictionary<String, String>, String>();
Соответственно через var :
var items = new Dictionary<Dictionary<String, String>, String>();
(Ссылка на вопрос : https://stackoverflow.com/questions/10572693/why-use-var-instead-of-the-class-name)
2) Использование var как итератор при перечислениях в коллекциях :
class Item {
public string Name;
}
foreach ( Item x in col ) {
Console.WriteLine(x.Name);
}
Код выше - скомпилируется без ошибок ,но при исполнении программы мы получим ошибку приведения типов . Потому что : сам цикл foreach может работать с обоими интерфейсами IEnumerable и IEnumrable<T> . Здесь же результат исполнения имеет тип object и C# компилятор кастит(приводит) это к типу Item . Следовательно , это небезопасно и может привести к ошибке работы программы ,потому что интерфейс IEnumerable может содержать объекты абсолютно любого типа.
Теперь вариант с var :
foreach ( var x in col ) {
Console.WriteLine(x.Name);
}
Здесь же тип x будет object если интерфейс IEnumerable и T если используется IEnumerable<T>
(Ссылка на вопрос : https://stackoverflow.com/questions/3425966/what-advantages-does-using-var-have-over-the-explicit-type-in-c)
3) И само собой - использование var при запросах + либо получение объекта с уже определенным типом :
var l = new List<string>(); // думаю ,очевидно какой тип будет у var
var s = new SomeClass(); //
var results = from r in dataContext.SomeTable select r; // Получение выборки из БД(путем LINQ To Enities)
Или запрос через подход LINQ To Objects :
var results = from item in someList
where item != 3
select item;
UPD: ну и пример с использованием анонимных типов :
var test = new {Id = 5,Name="Joseph"}
var result = context.MyTable.Select(x=>new {x.Id,x.Name}).ToArray();
(Ссылка на вопрос : https://stackoverflow.com/questions/41479/use-of-var-keyword-in-c-sharp?rq=1)
Краткий вывод из примеров выше : var - достаточно неплохая вещь ,поскольку он строго типизирован + правильное название переменных позволяет ещё и повысить читабельность . Что в суме значительно повышает эффективность кода без ущерба для безопасности
Вопрос в том : есть ли преимущества использования явного указания типов при объявлении переменных перед var?
Я просто новатор в этом деле и хотелось бы услышать мнение опытных людей.Спасибо за конструктивный ответ!
Я просто новатор в этом деле:) новатор? – tym32167 Sep 13 '17 at 13:34var. – EvgeniyZ Sep 13 '17 at 13:36varи тд – clyde Sep 13 '17 at 13:50var l = new List<string>();- что равноценноList<string> l = new List<string>();– clyde Sep 13 '17 at 13:52var zzz = new {Id = "asdasd", Name = "asdasd"};– tym32167 Sep 13 '17 at 13:58var result = context.MyTable.Select(x=>new {x.Id,x.Name}).ToArray();– tym32167 Sep 13 '17 at 14:19