Подтвердить что ты не робот

Инструмент для рефакторинга С# var для явного типа

Наши стандарты кодирования требуют, чтобы мы минимизировали использование С# var (предлагает ограничить его использование в сочетании с Linq). Однако бывают случаи, когда используются дженерики, где он достаточно удобен, например,

Dictionary<DateTime, Dictionary<string, float>> allValues = ...
// ...
foreach (var dateEntry in allValue)

проще набрать

foreach (KeyValue<DateTime, Dictionary<string, float>> dateEntry in allValue) 

(и проще, чем помнить, что в некоторых случаях явный тип).

Есть ли у любого из инструментов рефакторинга возможность конвертировать первое в последнее. Я посмотрел на Resharper, но, похоже, это не так (действительно, по умолчанию предлагается идти в противоположном направлении).

4b9b3361

Ответ 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>>();