Как вы используете функциональность сопоставления с образцом в ReSharper 5? - PullRequest
8 голосов
/ 20 августа 2010

Новое сопоставление с образцом в Resharper 5 кажется очень мощным, хотя для того, чтобы понять, как его использовать, требуется немало усилий

Для тех, кто не знаком с этой функцией, она позволяет вам искать конкретные шаблоны в вашем коде. Экземпляры таких шаблонов могут при желании быть заменены альтернативой. В IntelliJ это называлось структурным поиском и заменой. Это гораздо мощнее, чем простой поиск / замена RegEx.

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

Я предлагаю, чтобы каждый ответ включал:

  • краткое введение в обоснование модели
  • пример того, что он будет соответствовать
  • необязательный пример замены
  • XML, сгенерированный путем экспорта шаблона, чтобы другие тоже могли его опробовать

Ответы [ 9 ]

10 голосов
/ 20 августа 2010

Соответствует биту перечисления [Flags]

.NET 4 представляет метод System.Enum.HasFlag, который может привести в порядок ваш код.

До:

(myValue & MyFlagsEnum.Foo) == MyFlagsEnum.Foo

После того, как:

myValue.HasFlag(MyFlagsEnum.Foo)

XML:

<CustomPatterns>
  <Pattern Severity="SUGGESTION">
    <Comment>Can condense using 'Enum.HasFlag' method</Comment>
    <ReplaceComment>Replace bit matching with 'Enum.HasFlag'</ReplaceComment>
    <ReplacePattern>$myValue$.HasFlag($target$)</ReplacePattern>
    <SearchPattern><![CDATA[($myValue$ & $target$) == $target$]]></SearchPattern>
    <Params />
    <Placeholders>
      <ExpressionPlaceholder Name="myValue" ExpressionType="System.Enum" ExactType="False" />
      <ExpressionPlaceholder Name="target" ExpressionType="System.Enum" ExactType="False" />
    </Placeholders>
  </Pattern>
</CustomPatterns>
4 голосов
/ 17 февраля 2012

Удалить , если , охватить вокруг , если тело.

Пример:

Этот код:

if (ok)
{
  DoNextStep();
}

будет заменен на:

DoNextStep();

То есть только тело , если остается.

XML:

  <Pattern Severity="HINT">
    <Comment>if</Comment>
    <ReplaceComment>Remove enclosing if</ReplaceComment>
    <ReplacePattern>$body$</ReplacePattern>
    <SearchPattern>if($condition$){$body$}</SearchPattern>
    <Params />
    <Placeholders>
      <StatementPlaceholder Name="body" Minimal="-1" Maximal="-1" />
      <ExpressionPlaceholder Name="condition" ExpressionType="System.Boolean" ExactType="True" />
    </Placeholders>
  </Pattern>
3 голосов
/ 21 августа 2010

JetBrains предлагает Каталог образцов образцов для структурного поиска и замены для загрузки, содержащий 17 шаблонов:

  • блок 'try / finally' может быть преобразован в оператор 'using'
  • Метод StringBuilder.Append можно преобразовать в StringBuilder.AppendFormat
  • Сравнение с true избыточно
  • Условный оператор избыточен
  • Код недоступен
  • блок 'if' никогда не выполняется
  • Одинаковые ветви в условном операторе
  • Избыточное составное присваивание с помощью оператора | = *
  • Избыточное составное присваивание с помощью оператора & = *
  • Избыточное составное присвоение с оператором | = (альтернативный случай)
  • Избыточное составное присвоение с оператором & = (альтернативный случай)
  • Избыточная инициализация для false и блока условий
  • Резервная инициализация в true и блок условия
  • Метод Array.CreateInstance можно заменить на создание массива.n выражение
  • Метод Array.CreateInstance можно заменить выражением создания двумерного массива
  • Избыточное использование GetType () == typeof () со значением типа
  • Метод OfType можно использовать для фильтрации по типу
1 голос
/ 17 февраля 2012

Обычный актерский состав .

Пример:

Этот код:

string s = o as string;

будет заменено на:

string s = (string) o;

Так что теперь у вас есть обычное приведение вместо «как».

XML:

<Pattern Severity="HINT">
  <Comment>Cast (as)</Comment>
  <ReplaceComment>To regular cast</ReplaceComment>
  <ReplacePattern>($type$)$exp$</ReplacePattern>
  <SearchPattern>$exp$ as $type$</SearchPattern>
  <Params />
  <Placeholders>
    <ExpressionPlaceholder Name="exp" ExpressionType="" ExactType="True" />
    <TypePlaceholder Name="type" Type="" ExactType="True" />
  </Placeholders>
</Pattern>
1 голос
/ 17 февраля 2012

To 'as' cast .

Пример:

Этот код:

string s = (string) o;

будет заменен на:

string s = o as string;

Так что теперь у вас есть каст «как» вместорегулярного приведения.

XML:

<Pattern Severity="HINT">
  <Comment>Cast</Comment>
  <ReplaceComment>To 'as' cast</ReplaceComment>
  <ReplacePattern>$exp$ as $type$</ReplacePattern>
  <SearchPattern>($type$)$exp$</SearchPattern>
  <Params />
  <Placeholders>
    <TypePlaceholder Name="type" Type="" ExactType="True" />
    <ExpressionPlaceholder Name="exp" ExpressionType="" ExactType="True" />
  </Placeholders>
</Pattern>
1 голос
/ 17 февраля 2012

Снять вмещающие скобы вокруг тела.

Пример:

Этот код:

    foreach (int i in arr)
    {
      DoNextStep();
    }

будет заменен (Ctrl + L, чтобы удалить строку foreach, а затем запустите этот шаблон для удаления скобок) на:

DoNextStep();

Таким образом, после ввода двух сочетаний клавиш остается только набор скобок.

XML:

<Pattern Severity="HINT">
  <Comment>Curly braces with body</Comment>
  <ReplaceComment>Remove braces</ReplaceComment>
  <ReplacePattern>$body$</ReplacePattern>
  <SearchPattern>{$body$}</SearchPattern>
  <Params />
  <Placeholders>
    <StatementPlaceholder Name="body" Minimal="-1" Maximal="-1" />
  </Placeholders>

1 голос
/ 23 июня 2011

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

Итак, я создал шаблон, чтобы найти его:

AssertEx.That(() => myVariable.Status == MyEnum.Ok);  

... и замените его следующим:

Assert.AreEqual(MyEnum.Ok, myVariable.Status);

Вот шаблон:

<Pattern Severity="WARNING">
<Comment>AssertEx.That asserts for enum values don't give nice error msgs</Comment>
<ReplaceComment>Replace AssertEx.That asserts for enum values with trad Assert.AreEqual for better error msgs</ReplaceComment>
<ReplacePattern>Assert.AreEqual($enum$,$variable$.$property$)</ReplacePattern>
<SearchPattern><![CDATA[AssertEx.That(() => $variable$.$property$ == $enum$]]></SearchPattern>
<Params />
<Placeholders>
  <ExpressionPlaceholder Name="enum" ExpressionType="System.Enum" ExactType="False" />
  <IdentifierPlaceholder Name="variable" Type="" ExactType="False" RegEx="" CaseSensitive="True" />
  <IdentifierPlaceholder Name="property" Type="" ExactType="False" RegEx="" CaseSensitive="True" />
</Placeholders>

1 голос
/ 20 августа 2010

Перезапуск секундомера

.NET 4 представляет метод System.Diagnostics.Stopwatch.Restart(), который может привести в порядок ваш код.

До:

stopwatch.Reset();
stopwatch.Start();

После:

stopwatch.Restart();

XML:

<CustomPatterns>
  <Pattern Severity="SUGGESTION">
    <Comment>Use Restart method for System.Diagnostics.Stopwatch</Comment>
    <ReplaceComment>Use Restart method for System.Diagnostics.Stopwatch</ReplaceComment>
    <ReplacePattern>$stopwatch$.Restart();</ReplacePattern>
    <SearchPattern><![CDATA[$stopwatch$.Reset();
$stopwatch$.Start();]]></SearchPattern>
    <Params />
    <Placeholders>
      <ExpressionPlaceholder Name="stopwatch" ExpressionType="System.Diagnostics.Stopwatch" ExactType="True" />
    </Placeholders>
  </Pattern>
</CustomPatterns>
0 голосов
/ 22 октября 2010

Например, Microsoft рекомендует (и Code Analysis / FxCop генерирует соответствующие предупреждения), если вы проводите сравнение между строковым значением и пустой строкой, использовать метод String.IsNullOrEmpty().

http://david.gardiner.net.au/2010/02/resharper-5-structural-search-and.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...