基类中的静态成员是否在其派生类之间共享

时间:2011-04-18 09:59:58

标签: .net variables static

问题特别关注.Net。

假设基类A有2个派生类B和C.此外,假设基类A有一个名为's'的静态变量。这个静态变量值是在'B'和'C'之间共享的,还是每个都得到它自己的静态变量副本。

我目前的知识表明,除非基类是Generic,否则静态变量通常在派生类之间共享。如果基类是通用的,则为其类型参数的每个唯一组合创建该类的唯一副本,并且该类的每个此类副本以及该特定副本的派生类共享来自基类的相同satatic变量。 / p>

我实际上面临着一个非常独特的情况。就我而言,A,B和C都是非通用的。 A有一个静态成员。但是这个成员的值对于B和C是不同的,在我的理解中应该不是这样的(除非我上面的静态变量声明不正确)。

修改

我的应用程序是一个ASP.NET应用程序。我正在继续调试这个,但根据我目前的评估,它的发生方式如下:

  1. 我设置了一个断点,其中变量被更改,并且在第一次遇到断点时它的值会更新。
  2. 下次遇到断点时,变量已恢复为旧值并再次初始化。它是一个私有变量,只在一个地方发生变化。
  3. 我的猜测可能是应用程序应用程序域已经回收,或者不知何故该类已从内存中卸载。我仍在调查此事,但感谢大家的回复。

2 个答案:

答案 0 :(得分:4)

你能展示一些代码吗?

public class A
{
    private static string test;
    public string Test { get { return test; } set { test = value; } }

    public override string ToString()
    {
        return Test;
    }
}

public class B : A
{
    public override string ToString()
    {
        return base.ToString();
    }
}

public class C:A
{
    public override string ToString()
    {
        return base.ToString();
    }
}

测试控制台代码

    private static void Test()
    {
        Console.Clear();

        A a = new A();
        B b = new B();
        C c = new C();
        a.Test = "Test A";
        Console.WriteLine(a);
        Console.WriteLine(b);
        Console.WriteLine(c);
        b.Test = "Test B";
        Console.WriteLine(a);
        Console.WriteLine(b);
        Console.WriteLine(c);
        c.Test = "Test C";
        Console.WriteLine(a);
        Console.WriteLine(b);
        Console.WriteLine(c);

        Console.ReadKey();
    }

测试控制台结果

  

测试A

     

测试A

     

测试A

     

测试B

     

测试B

     

测试B

     

测试C

     

测试C

     

测试C

答案 1 :(得分:1)

基类中的静态成员在派生类之间共享。您在变量中看到的值应该与用于访问变量的不同派生类保持一致。