加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 06:59:26 所属栏目:百科 来源:网络整理
导读:我希望尽可能避免不必要的代码重复.在我下面描述的场景中,我使用了Action代理来避免代码重复.但是,使用Action委托方法时,代码变得慢约50%-80%. 从性能角度来看,是否有一种比Action代理更有效的方法来避免下面描述的场景中的代码重复? 我有两个等效的方法,
我希望尽可能避免不必要的代码重复.在我下面描述的场景中,我使用了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;
}

然后我可以按如下方式减少MethodA和MethodB:

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,dest_idx,src_idx) => dest[dest_idx] = src[src_idx]);
}

请注意,重构的MethodA和MethodB之间的唯一区别是HelperMethod调用的Action签名中src_idx和dest_idx的顺序.

解决方法

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读