Pull to refresh

C# vs R#: использование var вместо явного указания типа

Reading time 2 min
Views 24K


В своей работе с замечательным дополнением ReSharper в Visual Studio я постоянно сталкивался с предложением вместо явного объявления типа переменных использовать объявления типа в неявной форме с использованием var. Сначала меня это несколько удивило, но я особо не обратил внимание. Но по прошествии некотрого времени такие предложения стали уже напрягать и я решил разобраться в чем же суть такой оптимизации.

Ответ был найден в блоге у создателей R# по этому адресу. По катом мой перевод статьи Ильи Рыженкова (Ilya Ryzhenkov).



Итак, Илья приводит следующие доводы в пользу повсеместного использования «var»:
  • использование var потребуется вам для определения переменной с анонимным типом. Тут все просто — вы не сможете определить переменную анонимного типа без использования var;
  • использование var принуждает вас более грамотно называть сами переменные. Когда вы читаете определение переменной с явным типом, то получаете больше информации и что-нибудь типа «IUnitTestElement current» имеет смысл. Тем не менее, когда локальная переменная используется дальше, вы прочитаете «current», что потребует от вас больше времени понять что она означает. Использование «var currentElement» позволяет более быстро понимать переменную в любом месте кода;
  • использование var принуждает к более качественному API. Во-первых, вы получите оптимальные типы, когда позволяете компилятору получать самому тип возвращаемого значения метода или свойства. И еще вы вынуждены будете более правильно называть свои методы, чтобы они явно указывали на то, что возвращают;
  • использование var принуждает к инициализации переменных при их объявлении. В общем случае, инициализация переменных при определении является хорошим тоном, а в нашем случае, компилятор обязательно требует такую инициализация при определении переменной через var;
  • использование var приводит к уменьшению «шума» в коде. Существует множество случаев, когда объявленные неявно переменные уменьшают количество текста, который приходится читать разработчику и который он мог бы пропустить. Если мы не используем var, то определение переменной через выражение new или cast требует указание типа дважды. Когда мы имеем дела с обобщениями (generics), то такое положение дел приведет к появлению большого количества излишнего, чрезмерного кода (redundant code). Еще одним подобным примером может стать переменная итерации в foreach для типа наподобие «Dictionary<TKey,TValue>»;
  • использование var позволяет уменьшить использование директивы using. С var у вас нет явных ссылок на типы, и так как компилятор определит тип за вас, то вам не нужно импортировать пространства имен, когда вам требуется какая-нибудь временная переменная.

Вот такое вот объяснение. Хотел бы привести еще один комментарий к этой статье. Alexander пишет что Микрософт не рекомендует использовать var нигде кроме как в случае анонимных типов. На что Илья отвечает просто: «Yeah, Microsoft often tries to make things „safer“. I don't agree with them here :)». Думаю перевод тут излишен.

Как думает общественность, обоснованы ли доводы Ильи и, значит, ReSharper на повсеместное использование var вместо явного указания типа? Лично для меня доводы приведенные в статье показались весомыми и даже правильными. Кто как думает?
Tags:
Hubs:
+21
Comments 57
Comments Comments 57

Articles