2011-02-16 3 views
14

Можно создать дубликат:
What's the point of the var keyword?Какова цель 'var'?

Я не спрашивать, как это работает. Я не спрашиваю, влияет ли это на производительность. Я уже знаю эти ответы.

Я хочу знать, что вдохновило команду MS C#, чтобы добавить ее на язык в первую очередь. Вы не добавляете легкомысленные вещи на язык. Должна была быть проблема, которую он решил. Какова была эта проблема?

Ближайший пример, который я видел, чтобы «проблему он решает» является при использовании анонимных типов, как это:

var linqResult = from element in SomeCollection s 
       elect new { element.A, element.B }  

Ирония этого использовании является то, что стиль и кодирования-стандарты руководство (например, предоставленный Microsoft) советуют кодеру избегать использования «var», когда результирующий тип не является очевидным. Другими словами, предполагаемая цель «var» (предположительно) находится в противоречии с руководящими принципами кодирования.

Если бы я писал стандарты кодирования и пытался предотвратить чрезмерное использование «var», я бы несколько склонился сказать «использовать« var »только в ответ на анонимные типы». Но это ставит вопрос полным кругом: что было/цель с добавлением 'var' на язык?

+0

вы действительно ответили на свой вопрос.'var' был введен для поддержки анонимных типов, поскольку нет другого способа иметь переменную анонимного типа. – Andrey

+0

У вас уже есть ответ: первоначальная цель состояла в том, чтобы обрабатывать анонимные типы. –

+0

@ Давид - Бинго, я искал это. – ChaosPandion

ответ

14

Анонимные типы был большой, но и сокращение повторений в методах:

Dictionary<MyCustomType, List<MyOtherCustomType>> dict = new Dictionary<MyCustomType, List<MyOtherCustomType>>(); 
+1

Да. Это тот случай, когда ** очевидно ** какой тип переменной. Следовательно, его можно использовать в этом сценарии (хотя я этого не делаю). –

+0

@Robert Это стилистическое решение и вариант. Для повторений я всегда использую его (тип x = новый тип()), но метод вызывает это в каждом конкретном случае. –

7

Точно! Анонимные типы. Как в мире вы могли бы ссылаться на созданный анонимный тип, если бы не было var и все еще имели intellisense вместе с ним?

Другими словами: когда не было var, не было бы никаких анонимных типов в удобном для использования смысле, которые мы имеем сейчас с поддержкой времени компиляции. Было бы слишком много ошибок времени выполнения с анонимными типами.

Добавленный сахар (сложность при злоупотреблении) заключается в том, что вы можете использовать var с даже не анонимными переменными. Конечно, это работает, но это плохая привычка.

+1

Вы бы использовали объект, но недостатком было то, что у вас не было бы intellisense. –

+0

@Yuriy: у вас будет не только Intellisense, но и нет свойств - анонимный тип в примере OP имеет два свойства: .A и .B. Вы не можете получить доступ к System.Object.A, поскольку Object не имеет этого свойства, поэтому вам нужно его использовать. Бросьте это к чему? В .net 4 динамика может решить это, но .net 3 этого не было. –

+1

@ Майкл: Я мог бы, через отражение. Я просто не хотел бы этого делать. –

1

Насколько я знаю вар ключевое слово было сделано довольно много, чтобы сделать LINQ easierby позволяет использовать анонимные типы

+2

var не делает ничего, чтобы включить LINQ. –

0

От MSDN:

Во многих случаях использование ВДП необязательными и просто синтаксис удобство. Однако, когда переменная инициализирована анонимным типом , вы должны объявить переменную как var , если вам нужно получить доступ к свойствам объекта в более поздней точке. Этот является распространенным сценарием в выражениях LINQ .

Смежные вопросы