Инструмент для рефакторинга С# var для явного типа
Наши стандарты кодирования требуют, чтобы мы минимизировали использование С# var (предлагает ограничить его использование в сочетании с Linq). Однако бывают случаи, когда используются дженерики, где он достаточно удобен, например,
Dictionary<DateTime, Dictionary<string, float>> allValues = ...
// ...
foreach (var dateEntry in allValue)
проще набрать
foreach (KeyValue<DateTime, Dictionary<string, float>> dateEntry in allValue)
(и проще, чем помнить, что в некоторых случаях явный тип).
Есть ли у любого из инструментов рефакторинга возможность конвертировать первое в последнее. Я посмотрел на Resharper, но, похоже, это не так (действительно, по умолчанию предлагается идти в противоположном направлении).
Ответы
Ответ 1
У меня есть ReSharper 4.1, и он предлагает эту опцию (в любом направлении).
Собственно, я бы рекомендовал оспаривать стандарт... первый гораздо читабельнее, чем последний (особенно если вы вызываете переменную pair
или что-то подобное). Я бы не использовал "var" для var i = 0
, но он идеально подходит для вышеуказанного.
Для массового изменения перейдите к:
- Код очистки... (выберите профиль = > "Редактировать профили" = > Инструменты = > Очистка кода)
- С#
- Использовать 'var' в декларации
- Заменить направление = Can 'var' для использования типа
- 'foreach' iterator declaration style = Всегда использовать явный тип
- Локальный стиль объявления style = Всегда использовать явный тип
и запустите...
Ответ 2
Это возможно в Visual Studio 2017.
Инструменты > Параметры > Текстовый редактоp > С# > Стиль кодa > Общие -
Найти 'var' предпочтения > Когда тип переменной является очевидным. Для параметра "Предпочтение" выберите "Предпочитать явный тип", а для "Уровень важности" выберите "Предложение".
![введите описание изображения здесь]()
Теперь вы получите действия с лампочкой при использовании var
, и вы можете быстро перейти к явному типу с помощью сочетания клавиш Ctrl ..
![введите описание изображения здесь]()
![введите описание изображения здесь]()
Ответ 3
Resharper делает это (только в версии 4+ я уверен в этом)
но я не знаю, можно ли просто преобразовать var в автоматический тип определенного типа - в конце концов вам нужно перейти к "var", а затем появится свет, который дает вам возможность явно указать тип
Ответ 4
@Adam - вы не можете объявить здесь класс, так как это не будет то, что возвращается с IDictionary<,>.GetEnumerator()
, однако вы можете использовать псевдоним через using
:
using InnerPair = System.Collections.Generic.KeyValuePair<System.DateTime,
System.Collections.Generic.Dictionary<string, float>>;
Тогда:
foreach(InnerPair pair in dict) {...}
Это просто псевдоним типа, поэтому он работает нормально.
Ответ 5
DevExpress поддерживает это с помощью CodeRush, и они недавно начали раздавать некоторые из рефакторингов бесплатно. Рефакторинг, который вы ищете, - "Сделать явным"
http://devexpress.com/Products/Visual_Studio_Add-in/CodeRushX/
Ответ 6
Может быть, очень поздно, но я написал расширение Visual Studio 2015, которое делает это на платформе .NET Compiler. Заменить var с типом
Он проверен на нормальные сценарии, и если есть ошибка, я исправлю его как можно раньше и его также с открытым исходным кодом, если кто-то захочет внести вклад или улучшить этот инструмент.
Ответ 7
Я бы сказал, что там, где у вас есть сложные общие типы объектов домена, вы должны их typedef
class DomainValueCollection : KeyValue<DateTime, Dictionary<string, float>>{}
где DomainValueCollection - это нечто, что имеет смысл в контексте вашего домена.
тогда код становится
var allItems = new DomainValueCollection();
а не
var allItems = new KeyValue<DateTime, Dictionary<string, float>>();