我可以避免这种代码复制和粘贴吗?

时间:2013-03-31 08:02:11

标签: c# optimization

我有两个功能,它们的内容非常相似。

// 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拒绝内联它;可能是由于参数列表中的结构和/或'复杂'流控制元素)。

还有其他方式,还是我运气不好?

2 个答案:

答案 0 :(得分:0)

你所谈论的这种“重大”表现并不如你想象的那么重要。

如果它如此重要,您可以尝试告诉JIT编译器使用MethodImplOptions Enumeration内联它,虽然如果方法不是虚拟的,他应该这样做。 For more information

示例(来自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", "");
   }
}

答案 1 :(得分:-1)

我们不要寻找过于复杂的事情,那又怎么样?不是那么干净,但这可能是你必须付出的代价才能兼顾非复制和表现:

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
        }
    }
}