[flood] в чем прикол var C# 3.0? (использовать только внутри метода)

6yrop

сейчас вот помаленьку смотрю C# 3,0 и тут писать в стиле "что вижу о том пишу", поэтому сильно не пинайте за ламерские вопросы.
язык запросов на первый взгляд выглядит как то, чего нам не хватало. Но запросы принято писать не прям на призенташен уровне, а все таки выносить в отдельный уровень, а тогда как передавать результат если var можно использовать только внутри метода

var query = from cust in customers
where cust.City == "Phoenix"
select new {cust.Name, cust.Phone};
foreach(var item in query)
{
Console.WriteLine("Name={0}, Phone={1}", item.Name, item.Phone);
}

распечатать результат по месту это не совсем то, что нужно в реальных приложения.

timefim

Наверное всетаки не var а анонимные структуры, которые как я понимаю являются просто удобными контейнерами внутри функций и не более того.

6yrop

Наверное всетаки не var
анонимные структуры могут присваиваться только к var, а собственно var используется только внутри метода

timefim

Пользу от var значит ты тоже не видишь?

6yrop

Пользу от var значит ты тоже не видишь?
польза вроде как есть, но она какая-то странная :grin: . Для отображения результата запроса где-нибудь на форме анонимные классы не подойдут, поскольку желательно не размещать запрос прям на форме. Где они могут пригодиться? При реальизации каких-нибудь расчетов, когда надо какие-нибудь параметры вытащить из базы. Да, тут они вроде полезны. Но тоже немного странно, вот мы захотели этот запрос вынести в отдельный метод (ну чтобы несколько раз его использовать и что нам теперь, для такого в общем-то привычного рефакторинга, потребуется вместо анонимного класса писать руками уже не анонимный класс?
А использовать var для не анонимных классов не рекомендуют — ухудшается читаемость кода.

timefim

Но тоже немного странно, вот мы захотели этот запрос вынести в отдельный метод (ну чтобы несколько раз его использовать и что нам теперь, для такого в общем-то привычного рефакторинга, потребуется вместо анонимного класса писать руками уже не анонимный класс?
Анонимное что то нужно для меньших телодвижений. Если же тебе это что то необходимо в нескольких местах, то у него, по логике, должно быть имя.
А использовать var для не анонимных классов не рекомендуют — ухудшается читаемость кода.

Чем же
List<int> someThingList = new List<int>
читабельней чем
var someThingList = new List<int>
?

aleks058

Я тоже посмотрел и понял, что не все так хорошо, как говорят.
Придется делать возвращаемый тип object или IEnumerable, что сразу убивает все плюсы строгой типизации. А так как реального типа мы не знаем (анонимный класс все-таки с объектом можно будет работать только через рефлекшн.
В общем, абсолютно бесполезная получилась фича, ИМХО.
А так здорово смотрелась на презенташках!
И решить-то проблему при наличии ключевого слова var не составляло труда.
Есть у Микрософта особенности, не исчезающие с годами!

aleks058

>> А использовать var для не анонимных классов не рекомендуют — ухудшается читаемость кода.
Кто не рекомендует?
Все наоборот, настоятельно рекомендуют!
Даже такая тупая реализация var, как в третьем C#, позволяет писать не такое:
Dictionary<BookKey, List<BookKey>> children = new Dictionary<BookKey, List<BookKey>>

, а такое:
var children = new Dictionary<BookKey, List<BookKey>>

и тем более теперь должно быть можно написать такое:

var comparer = delegate(Person p1, Person p2) { return p1.Age - p2.Age; }

а может быть даже такое (хотя сильно сомневаюсь):

var comparer = (Person p1, Person p2) => p1.Age - p2.Age;

(студии под рукой нет, не гарантирую компилируемость, но идея ясна).
Или последнее - лишь мечты и ничего такого не получается?

timefim

Или последнее - лишь мечты и ничего такого не получается?
Между последним и предпоследним разницы никакой нет, и в обоих случаях нужно указывать слева или справа тип делегаты.

6yrop

Кто не рекомендует?
да вроде прям C# Reference написано
 
Overuse of var can make source code less readable for others. It is recommended to use var only when it is necessary, that is, when the variable will be used to store an anonymous type or a collection of anonymous types.
http://msdn2.microsoft.com/en-us/library/bb383973%28VS.90%29...
  

По ходу дела посмотрим как лучше этим пользоваться.

aleks058

Понятно. Жаль. Походу, анонимность в третьем шарпе довольно ограничена.
Оставить комментарий
Имя или ник:
Комментарий: