2010-08-27 1 views
10

Когда я говорюПочему я должен использовать неявно типизированные локальные переменные?

public static IMyType GetGateWayManager() 
{ 
    IUnityContainer _container = GetContainer(); 
    IMyType _gateWayManager = _container.Resolve<IMyType>(); 
    return _gateWayManager; 
} 

он приходит с предупреждением говоря Use implicitly types local variable.

Если изменить его

public static IMyType GetGateWayManager() 
{ 
    IUnityContainer _container = GetContainer(); 
    var_gateWayManager = _container.Resolve<IMyType>(); 
    return _gateWayManager; 
} 

это прекрасно.

Может ли кто-нибудь сказать мне, почему редактор VS считает, что лучше использовать var здесь?

+4

Что дает это предупреждение? Это компилятор VS или внешний инструмент, такой как ReSharper? – codeulike

+1

Тот факт, что вы говорите «потерять тип», предполагает, что вы можете получить доступ к документации для «var». Это не означает «вариант». – AakashM

+2

определенно выглядит как предупреждение Resharper ... –

ответ

12

Кто такие типы?

Компилятор? Да, конечно. Компилятор использует типы, чтобы сделать его более вероятным, чтобы ваша программа правильно работала во время выполнения, гарантируя соответствие типов, вы вызываете фактически существующие методы и передаете им параметры нужного типа. Здесь компилятор проверяет, что вы действительно возвращаете что-то типа IMyType.

Редактор? Опять же, да. Редактор использует информацию о фоновой компиляции и типе, чтобы помочь вам написать код. Когда вы нажмете . после _container, он использует информацию о типе, чтобы сообщить вам, что существует метод Resolve и какие параметры он принимает.

Вы? Не так много. Мы уже видели, что компилятор гарантирует, что вы вернете что-то типа IMyType, так почему вы хотите объявить его как этот тип, когда компилятор сможет его обработать и проверить его? Точно так же редактор расскажет вам о методах в контейнере, поэтому почему вы заботитесь о том, является ли это контейнером Unity или каким-либо другим типом контейнера, если вы уже знаете из имени переменной, это какой-то контейнер и из редактор, который имеет метод Resolve.

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

public static IMyType GetGateWayManager() 
{ 
    var container = GetContainer(); 
    var gateWayManager = container.Resolve<IMyType>(); 
    return gateWayManager; 
} 
+3

. Существует преимущество для неявного ввода текста, что означает, что если возвращаемый тип GetContainer изменился (но сохранил одну и ту же подпись) либо потому, что он был переименован или заменен аналогичным типом, вышеупомянутый код не нуждается в изменении, чтобы справиться. (Хотя, его пришлось бы перестроить) – Massif

+0

Да, хорошие имена переменных. Какая прекрасная идея. Opacity_in_names_should_be_avoided. – Allen

2

Возможно, это не редактор VS, а ReSharper, который дает вам это сообщение. Это скорее вопрос вкуса, чем лучшая практика. Но как только вы привыкнете к ключевому слову var, вы начинаете все больше и больше. По крайней мере, я научился любить его.

+0

Но не использует ' var' влияет на время выполнения? – Itsik

+2

@ltsik - Нет, это не отличается от объявления типа вручную. –

+1

@ Itsik, Нет, это просто синтаксический сахар и будет преобразован в нужный тип во время компиляции. Это не динамический тип, а просто способ спасти программиста от записи List >> и т. Д. –

1

Это рестартер, предупреждающий вас, а не редактор VS.

5

Возможно, это ReSharper.

ReSharper рекомендует использовать код var, когда тип переменной можно увидеть в коде. В вашем примере мы можем видеть, что _gateWayManager будет иметь тип IMyType, тогда мы используем ключевое слово var для неявной типизации переменной. _container будет явно введено в код, потому что мы не можем сказать, объект, тип которого будет возвращен GetContainer()

6

с использованием var вместо явного типа предлагается resharper, потому что он ясен и полезен.

Очистить, потому что у вас меньше написано кода, а ваш фокус - на имя переменной вместо имени типа. Вы можете подумать, что имя типа полезно, но через короткое время вы просто забудете его.

Полезно, потому что, когда вы меняете возврат типа метода, вам не нужно будет менять все типы на своем пути.

Пример:

int id = getId(); 
List<MyType> myList = FindById(id); 

В этой ситуации, если вы измените идентификатор из междунар в Guid вы должны изменить это «ИНТ» здесь. Это мало, но легко может стать большим в реальных проектах. С var у вас есть достаточно кода для компилятора, и его не нужно постоянно менять.

var id = getId(); 
var myList = FindById(id); 

Я предпочитал явные типы, но через несколько часов после проверки var я не позволяю так легко.

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

+0

Итак, глядя на ваш второй пример, просто взглянув на метод FindById, какой тип возвращается? Вы не можете сказать, что это недостаток неявных типов. – LarryBud

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