Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 简洁、快速的单例子类_C#_C# 4.0_Singleton_Subclass - Fatal编程技术网

C# 简洁、快速的单例子类

C# 简洁、快速的单例子类,c#,c#-4.0,singleton,subclass,C#,C# 4.0,Singleton,Subclass,我正在用C#编写一个动态语言的解释器,并使用虚拟Apply方法将原语函数作为抽象类原语实现,其中每个实际的原语函数都是重写Apply的子类 (另一种选择是只使用类原语并为Apply存储一个函数指针。但是,将其作为虚拟方法可能会稍微快一些,并且此代码将非常频繁地运行,因此值得使用一个小的加速。) 显然,我可以继续为每个基本函数创建一个完整的类文件,但我忍不住觉得应该有一种比创建几十个小类文件更简洁的方法来做事情 在Java中,我会使用匿名子类语法在一个表达式中创建和实例化一个子类,但我认为C#没有

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

(另一种选择是只使用类原语并为Apply存储一个函数指针。但是,将其作为虚拟方法可能会稍微快一些,并且此代码将非常频繁地运行,因此值得使用一个小的加速。)

显然,我可以继续为每个基本函数创建一个完整的类文件,但我忍不住觉得应该有一种比创建几十个小类文件更简洁的方法来做事情

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

在C#中实现这一点的最佳方法是什么?

首先,我不认为虚拟方法调用会比委托更快。也许会,也许不会——但如果绩效对你来说真的那么重要,你应该衡量一下。使用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相同@RobertHarvey Thank-C#匿名类型不支持方法,虽然度量是理想的方法,但我不知道如何在不做两次测试的情况下创建一个真实的测试;合成微基准可能在JIT中进行不同的优化。除了可重写的Apply方法外,抽象类原语还包含什么?还有ToString的重写,它给出了原语函数的名称。是的,我认为你是对的。还需要重写ToString,这将很容易地适应嵌套类;按行数计算,结果会有点冗长,但基本上只是将粘贴的样板文件复制到一个类文件中,所以应该可以正常工作。
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;
        }
    }
}