简洁,快速的单例子类

rwa*_*ace 2 c# singleton subclass c#-4.0

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

(另一种方法是只有类Primitive并存储一个用于Apply的函数指针.但是,使它成为一个虚拟方法似乎可能会稍微快一些,并且这个代码将非常频繁地运行,所以一个小的加速是值得拥有的. )

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

在Java中,我使用匿名子类语法在一个表达式中创建和实例化一个子类,但我不认为C#具有完全对应的.

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

Jon*_*eet 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
Run Code Online (Sandbox Code Playgroud)

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

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)