我通常不太喜欢重构工具。无需深入细节。不过,我偶尔会尝试新版本。这是我在评估 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 没有将此作为单个重构。我可能会这样做:
- 选择要包装的方法的内容,并使用 Extract Method 从内容中创建一个新的私有(private)方法。
- 原来的方法现在是围绕“自身”的简单包装。如果您愿意,可以重命名它,或者按照您的喜好对其进行操作(使其成为静态的,移动到不同的类,用 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/