抽象超类中的c#静态将在子类之间共享?

抽象超类中的c#静态将在子类之间共享?,c#,abstract-class,static-members,ashx,C#,Abstract Class,Static Members,Ashx,我正在编写一些连接到模拟服务的ashx处理程序,我希望它们共享模拟服务实例。我认为最简单的方法是创建一个静态实例 public class AbstractHandler { static IService _impl; public static IService Impl { get { if (_impl == null)

我正在编写一些连接到模拟服务的ashx处理程序,我希望它们共享模拟服务实例。我认为最简单的方法是创建一个静态实例

public class AbstractHandler
    {
        static IService _impl;
        public static IService Impl
        {
            get
            {
                if (_impl == null)
                {
                    _impl = new MockService();
                }
                return _impl;
            }
        }
    }

然而,我想知道这是否会起作用;从该类继承的不同处理程序将有自己的静态\u impl引用还是共享?

静态字段只存在一次,但泛型类型除外,在这种情况下,对于每个使用的泛型参数组合,静态字段只存在一次

即使该类是基类(可能是抽象类),同样的规则也适用。请注意,如果声明字段的类不是泛型的,则即使子体是泛型的,该字段也将存在一次。只有在声明静态字段的类是泛型的情况下,“每个组合一次…”规则才起作用

那么,如果你的问题是:

如何使静态字段为每个后代而不是一次

那么答案应该是您应该使基类成为泛型的,并将后代类型作为泛型参数传递

演示“每个通用参数组合一次”的示例脚本:

void Main()
{
var i=新测试();
var s=新测试();
Test.UsageCount.Dump();
Test.UsageCount.Dump();
Test.UsageCount.Dump();
}
公开课考试
{
公共静态使用计数;
公开考试()
{
UsageCount++;
}
}
输出:

0 1 1 1 1 0 0 1. 1. 使用基类演示的示例:

void Main()
{
    var i = new Test1();
    var s = new Test2();

    Test1.UsageCount.Dump();
    Test2.UsageCount.Dump();
    Test3.UsageCount.Dump();
}

public abstract class Base<T>
{
    public static int UsageCount;

    protected Base()
    {
        UsageCount++;
    }
}

public class Test1 : Base<Test1>
{
}

public class Test2 : Base<Test2>
{
}

public class Test3 : Base<Test3>
{
}
void Main()
{
var i=新的Test1();
var s=新的Test2();
Test1.UsageCount.Dump();
Test2.UsageCount.Dump();
Test3.UsageCount.Dump();
}
公共抽象类基
{
公共静态使用计数;
保护基()
{
UsageCount++;
}
}
公共类Test1:Base
{
}
公共类Test2:Base
{
}
公共类Test3:Base
{
}
输出:

0 1 1 1 1 0 1. 1. 0