繁体   English   中英

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

[英]c# static in abstract superclass will be shared among subclasses?

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

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

但是,我想知道这是否会起作用; 从这个类继承的不同处理程序将拥有自己的静态_impl引用或者它们将被共享吗?

除了通用类型的情况之外,静态字段存在一次,在这种情况下,对于每个使用的通用参数组合,它存在一次。

即使该类是基类,可能是抽象的,也适用相同的规则。 请注意,如果声明字段的类不是通用的,则该字段将存在一次,即使后代是通用的。 关于“每个组合一次......”的规则只有在声明静态字段的类是通用的时才起作用。

所以,如果你的问题是:

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

那么答案就是你应该使你的基类通用,并将后代类型作为泛型参数传递。

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

void Main()
{
    var i = new Test<int>();
    var s = new Test<string>();

    Test<bool>.UsageCount.Dump();
    Test<int>.UsageCount.Dump();
    Test<string>.UsageCount.Dump();
}

public class Test<T>
{
    public static int UsageCount;

    public Test()
    {
        UsageCount++;
    }
}

输出:

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>
{
}

输出:

1
1
0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM