2

我正在用 C# 编写动态语言的解释器,并将原始函数实现为具有虚拟 Apply 方法的抽象类 Primitive,其中每个实际的原始函数都是覆盖 Apply 的子类。

(另一种方法是只使用 Primitive 类并为 Apply 存储一个函数指针。但是,将其设置为虚拟方法似乎会稍微快一些,并且此代码将非常频繁地运行,因此值得进行小幅加速。 )

显然,我可以继续为每个原始函数创建一个完整的类文件,但我不禁觉得应该有一种比创建几十个微小的类文件更简洁的处理方式。

在 Java 中,我会使用匿名子类语法在一个表达式中创建和实例化一个子类,但我不认为 C# 有一个精确的对应物。

在 C# 中执行此操作的最佳方法是什么?

4

1 回答 1

5

首先,我不会假设虚拟方法调用会比委托更快。也许它会,也许它不会——但如果性能对你来说真的那么重要,你应该衡量它。使用 lambda 表达式对此进行编码非常简单,特别是如果要表示的只是一个函数:

public static readonly Func<int, int> Addition = (x, y) => x + y;
public static readonly Func<int, int> Subtraction = (x, y) => x - y;
// etc

(我只是猜测这里的操作,因为我们不知道细节。)

C# 中的子类没有特别小的语法,但对于像这样的半单例,我发现嵌套类工作得很好......类似于 Java 枚举:

public abstract class Primitive
{
    public static readonly Primitive Addition = new AdditionPrimitive();
    public static readonly Primitive Subtraction = new SubtractionPrimitive();

    // Prevent outside instantiation
    private Primitive()
    {
    }

    public abstract int Apply(int x, int y);

    // Anything else you want

    private class AdditionPrimitive : Primitive
    {
        public override int Apply(int x, int y)
        {
            return x + y;
        }
    }

    private class SubtractionPrimitive : Primitive
    {
        public override int Apply(int x, int y)
        {
            return x - y;
        }
    }
}
于 2013-05-10T05:30:48.267 回答