我在C#中编写动态语言的解释器,并将原始函数作为带有虚拟Apply方法的抽象类Primitive实现,其中每个实际的原始函数都是覆盖Apply的子类。
(另一种方法是只有类Primitive并存储一个用于Apply的函数指针。但是,使它成为一个虚方法看起来可能稍微快一点,而且这段代码会非常频繁地运行,所以加速很小就是值得拥有。)
显然,我可以继续为每个原始函数创建一个完整的类文件,但我不禁觉得应该采用比创建几十个小类文件更简洁的方式。
在Java中,我使用匿名子类语法在一个表达式中创建和实例化一个子类,但我不认为C#具有完全对应的。
在C#中执行此操作的最佳方法是什么?
答案 0 :(得分:5)
首先,我不会假设虚拟方法调用将比委托更快。也许它会,也许它不会 - 但如果性能真的对你很重要,你应该衡量一下。使用lambda表达式对此进行编码非常简单,特别是如果您尝试表示的 all 是一个函数:
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;
}
}
}