c# - 替换方法的所有用法(引入间接)

标签 c# refactoring resharper

我通常不太喜欢重构工具。无需深入细节。不过,我偶尔会尝试新版本。这是我在评估 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));
    }
}

从用法中选择并可能省略公共(public)参数(例如上面的 250 个)或非扩展静态的公共(public)实例参数将使此功能更有值(value)。希望这可以解决问题。

最佳答案

ReSharper 没有将此作为单个重构。我可能会这样做:

  1. 选择要包装的方法的内容,并使用 Extract Method 从内容中创建一个新的私有(private)方法。
  2. 原来的方法现在是围绕“自身”的简单包装。如果您愿意,可以重命名它,或者按照您的喜好对其进行操作(使其成为静态的,移动到不同的类,用 try/catch 包围,等等)。

编辑: 根据您的编辑,您似乎还有其他问题。 Console.Beep 不仅不在同一个类中,甚至也不在您的类中。

但是如果你不介意一点搜索和替换,那么你可以把它放到你自己的类中,然后进行重构:

namespace Temporary {
    public class Console {
        public static void Beep(int x, int y) {System.Console.Beep(x,y);}
    }
}

然后执行“在文件中替换”以将 Console.Beep 替换为 Temporary.Console.Beep,然后按上述操作。

关于c# - 替换方法的所有用法(引入间接),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/857213/

相关文章:

c# - WPF:我应该如何重构这个 C# 项目?

design-patterns - 策略的替代模式

ReSharper 格式化 - 将方法右括号放在新行上

c# - 在面板中创建 KeyDown 事件时遇到问题

C# XAML - 获取 XAML 内容属性 (contentControl.Content)

refactoring - Autofixture 生成自定义列表

c# - Resharper 8 找不到接口(interface)的实现

c# - 从基本接口(interface)方法中查找用法

c# - 禁用打印对话框弹出

c# - 无法将方法组分配给 asp.net、linq、c# 中的隐式类型局部变量