Автоматически обмениваться явным типом с ключевым словом var - PullRequest
1 голос
/ 09 декабря 2010

Я хочу автоматически удалить все явные типы и обменять их с ключевым словом var в большом решении, например, вместо

int a = 1;

Я хочу получить:

var a = 1;

Thisэто просто косметика, код в решении работает отлично, я просто хочу, чтобы все было согласованно, так как я начал использовать явные типы, но позже использовал ключевые слова var.

Полагаю, у меня было бынаписать какой-то парсер кода - звучит немного громоздко.Кто-нибудь знает простое решение этого вопроса?

Приветствия, Крис

Ответы [ 5 ]

6 голосов
/ 09 декабря 2010

Это не ответ как таковой , но это слишком долго для комментария.

Вы должны строго рассмотреть , а не делать это.Нет никакой стилистической проблемы со смешиванием явной и логической типизации (вы должны выводить типы, когда вам это нужно, когда вы используете анонимные типы или когда это облегчает чтение кода), и есть множество потенциальных проблем, с которыми вы можете столкнуться при этом:

  • Недопустимы объявления без присвоения
  • Недопустимы объявления, присвоенные null
  • Объявления, имеющие супертип, но инициализированные для экземпляра подтипа(или совместимый, но другой тип) изменит их значение.

IE

object foo = "test";

...

foo = 2;

Очевидно, это простой (и маловероятный) пример, но изменение foo с object на var приведет к fooбудучи напечатанным как string вместо object, и изменит семантику кода (в этом случае он даже не скомпилируется, но вы можете легко столкнуться с более трудными для поиска сценариями, в которых он изменяет разрешение перегрузки, но не выдает ошибку во время компиляции).

Другими словами, не делайте этого, пожалуйста.

1 голос
/ 09 декабря 2010

Во-первых, это, вероятно, не очень хорошая идея.Нет никакого преимущества перед var над int;многие объявления будут почти такими же простыми.

Но если вам нужно ...

Частично ручное решение - превратить подсказку ReSharper "Use var" в предупреждение и заставить ее исправить их всевверх.Я не знаю, сделает ли это ReSharper в массовом порядке , но я часто пролистываю плохо сделанный фрагмент стороннего кода с быстрой последовательностью Alt + PgDn , Alt + Enter .

Это имеет существенное преимущество, заключающееся в том, что ReSharper уважает семантику вашего кода.Он не заменит типы без разбора, и я уверен, что он будет вносить только те изменения, которые не влияют на смысл вашей программы.Например: он не заменит object o = "hello"; (я думаю; я не перед VS, чтобы это проверить).

0 голосов
/ 09 декабря 2010

Я бы опасался делать это в автоматическом режиме. Есть места, где это может фактически изменить семантику программы или привести к ошибкам. Например,

 IEnumerable<string> list = MethodThatReturnsListType();

или

 string foo = null;
 if (!dict.TryGetValue( "bar", out foo ))
 {
      foo = "default";
 }

Поскольку это не ошибки, я просто заменил бы их, когда вы касаетесь кода по другим причинам. Таким образом, вы можете проверить окружающий код и убедиться, что вы не меняете семантику и избегаете ошибок, которые необходимо исправить.

0 голосов
/ 09 декабря 2010

Посмотри на Лекса и Яка.Вы можете комбинировать это со скриптом perl или awk для механического редактирования вашего источника.

Вы также можете сделать это в Emacs, используя CEDET.Он анализирует модули кода и создает таблицу анализа кода.

В любом случае вам потребуется выполнить анализ кода, который описывает ... объявления классов (имя класса, родительские типы, начальная и конечная точки), объявления методов (аналогичные), объявления переменныхи так далее.Затем вы напишите некоторый код (perl, awk, powershell, elisp и т. Д.), Который обходит таблицу и выполняет замену в каждом соответствующем объявлении переменной.

0 голосов
/ 09 декабря 2010

Что такое поиск / замена в Visual Studio IDE. Например, выполните поиск vor 'int' и замените его на 'var'.

...