是否有比C#Action代表更有效的方法来避免代码重复?

时间:2012-03-22 15:57:04

标签: c# delegates refactoring code-duplication

我希望尽可能避免不必要的代码重复。在我下面描述的场景中,我使用了Action个委托来避免代码重复。但是,使用Action委托方法时,代码变得慢约50%-80%。

从性能角度来看,是否有一种比Action代理更有效的方法,以避免在下面描述的场景中出现代码重复?

除了冗长循环的最内层语句之外,我有两个等价的方法:

public T[] MethodA<T>(T[] from)
{
  ...
  for (var i = 0; i < len; ++i)
  {
    var j = GetIndex(i);
    to[j] = from[i];    // This statement differs in MethodA and MethodB
  }
  ...
  return to;
}

public T[] MethodB<T>(T[] from)
{
  ...
  for (var i = 0; i < len; ++i)
  {
    var j = GetIndex(i);
    to[i] = from[j];    // This statement differs in MethodA and MethodB
  }
  ...
  return to;
}

为了避免代码重复,我实现了一个带有Action委托的辅助方法。委托的调用替换了变量语句,如下所示:

private T[] HelperMethod<T>(T[], Action<T[], T[], int, int> action)
{
  ...
  for (var i = 0; i < len; ++i)
  {
    var j = GetIndex(i);
    action(from, to, i, j);    // Invoke the Action delegate
  }
  ...
  return to;
}

然后我可以按如下方式减少MethodAMethodB

public T[] MethodA<T>(T[] from)
{
  return HelperMethod(from, (src, dest, src_idx, dest_idx) => dest[dest_idx] = src[src_idx]);
}

public T[] MethodB<T>(T[] from)
{
  return HelperMethod(from, (src, dest, dest_idx, src_idx) => dest[dest_idx] = src[src_idx]);
}

请注意,重构的MethodAMethodB之间的唯一区别是src_idxdest_idx Action签名中HelperMethod和{{1}}的顺序1}}来电。

1 个答案:

答案 0 :(得分:1)

您可以将参数传递给方法,并根据参数执行A或B. 我不喜欢它,但我只是说可以做到。我其实更喜欢Action方式。