我能避免这种代码的复制粘贴吗?

本文关键字:复制 能避免 代码 | 更新日期: 2023-09-27 18:06:35

我有两个函数,它们的内容非常相似。

// mock-up code
bool A() {
    while(1000000) {
        // 3 lines of A() specific code
        // 15 lines of shared code, pasted in
        // 1 lines of A() specific code
    }
}
bool B() {
    while(1000000) {
        // 2 lines of B() specific code
        // 15 lines of shared code, pasted in
        // 2 lines of B() specific code
    }
}     

我不希望将这15行共享代码粘贴到两个函数中(因为这些行非常复杂,如果我稍后更改这些代码,我不想要记住在两个地方更改它)。

如果我把这15行代码放到一个单独的函数中,我的性能会受到很大的影响(JIT拒绝内联它;可能是由于参数列表中的结构和/或"复杂"的流量控制元素)。

还有别的办法吗,还是我运气不好?

我能避免这种代码的复制粘贴吗?

你所说的"重大"性能影响远没有你想象的那么严重。

如果它如此重要,您可以尝试告诉JIT编译器使用MethodImplOptions枚举来内联它,尽管如果方法不是虚拟的,他应该这样做。查看更多信息。

示例(来自MSDN):

using System;
using System.Globalization;
using System.Runtime.CompilerServices;
public class Utility
{
   [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] 
   public static string GetCalendarName(Calendar cal)
   {
      return cal.ToString().Replace("System.Globalization.", "").
                 Replace("Calendar", "");
   }
}

我们不要找太复杂的东西,这个怎么样?不那么干净,但这可能是你必须付出的代价,既不复制又有性能:

boolean AorB (boolean flagA) {
    while(1000000) {
        if (flagA) {
            // 3 lines of A() specific code
        }
        else {
            // 1 line of B() specific code
        }
        // 15 lines of shared code, pasted in
        if (flagA) {
            // 2 lines of A() specific code
        }
        else {
            // 2 lines of B() specific code
        }
    }
}