是否有比C#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, (src, dest, dest_idx, src_idx) => dest[dest_idx] = src[src_idx]);
}
请注意,重构的MethodA和MethodB之间的唯一区别是HelperMethod调用的Action签名中src_idx和dest_idx的顺序.
解决方法:
您可以将参数传递给方法,并根据参数执行A或B.
我不喜欢它,但我只是说可以做到.我其实更喜欢Action方式.
标签:c,delegates,refactoring,code-duplication 来源: https://codeday.me/bug/20190709/1416053.html