Я вообще не очень люблю инструменты рефакторинга. Не нужно вдаваться в подробности. Тем не менее, я иногда пробую новые версии. Вот что я пытался сделать, оценивая resharper 4.5:
Мне нужно было заменить все использования метода методом-оболочкой (который должен быть создан), но я не мог. Я обычно плохо замечаю очевидную особенность, так ли это? Если у resharper нет этой функции, знаете ли вы такие инструменты?
Редактировать 2: Образец был улучшен, чтобы включить вызовы методов экземпляра. Редактировать: вот простой случай, чтобы играть.
static void Main(string[] args)
{
while(true)
{
if (Console.ReadKey().Key == ConsoleKey.Escape)
{
Thread.Sleep(10);
if (Quiting()) break;
}
Console.Beep(250, 50);
}
}
static bool Quiting()
{
if (Console.In.Peek() > 0)
{
Console.Beep(250, 150);
return false;
}
return true;
}
Мне нужно что-то вроде: (Edit2: добавлен образец экземпляра)
private static StringBuilder _builder = new StringBuilder();
static void Main(string[] args)
{
while(true)
{
var key = Console.ReadKey();
if (key.Key == ConsoleKey.Escape)
{
Thread.Sleep(10);
if (Quiting()) break;
}
_builder.Append(" (").Append(key.KeyChar).Append(") ");
Beep(250, 50);
}
}
static bool Quiting()
{
if (Console.In.Peek() > 0)
{
Beep(250, 150);
_builder.Append('@');
return false;
}
return true;
}
static void Beep(int frequency, int duration)
{
// finally cursor ends up here
Console.Beep(250, 50);
}
Вызовы Console.Beep переработаны. Далее давайте рефакторим StringBuilder.Append(char) :
class Program
{
private static StringBuilder _builder = new StringBuilder();
static void Main(string[] args)
{
while(true)
{
var key = Console.ReadKey();
if (key.Key == ConsoleKey.Escape)
{
Thread.Sleep(10);
if (Quiting()) break;
}
_builder.Append(" (").AppendUpper(key.KeyChar).Append(") ");
Beep(250, 50);
}
}
static bool Quiting()
{
if (Console.In.Peek() > 0)
{
Beep(250, 150);
_builder.AppendUpper('n');
return false;
}
return true;
}
static void Beep(int frequency, int duration)
{
// finally cursor ends up here
Console.Beep(250, 50);
}
}
static class StringBuilderExtensions
{
public static StringBuilder AppendUpper(this StringBuilder builder, char c)
{
return builder.Append(char.ToUpper(c));
}
}
Выбор из вариантов использования и, возможно, исключение общих параметров (таких как 250 выше) или общих параметров экземпляра для статики без расширения сделают эту функцию более полезной. Надеюсь, это проясняет вопрос.
