【问题标题】:Are static members in base classes shared across its derived classes基类中的静态成员是否在其派生类之间共享
【发布时间】:2011-04-18 09:59:58
【问题描述】:

问题具体与.Net有关。

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

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

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

编辑:

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

  1. 我在变量发生更改的地方放置了一个断点,并且在第一次命中该断点时它的值得到更新。
  2. 下一次命中断点时,变量已恢复为旧值并再次初始化。它是一个私有变量,只在一个地方更改。

我的猜测可能是应用程序域已回收或以某种方式从内存中卸载了该类。我还在调查这个问题,但感谢大家的回复。

【问题讨论】:

  • 如果您可以构建一个简短但完整的代码示例,我们或许能够弄清楚发生了什么,或者通过尝试这样做,您可能会发现问题的原因。
  • 我唯一的猜测是静态是否用 ThreadStaticAttribute 装饰,并且您正在从不同的线程观察它。
  • 您关于泛型类的 cmets 暗示了一个混淆因素。具体的泛型类不是从假定的开放泛型“基类”“派生”的。
  • @Damien:很抱歉之前没有提供代码。但是@rdkliene 下面的代码已经足够好了。而且我没有用 ThreadStaticAttribute 装饰它。 @Aakash-我从未说过具体的泛型类派生自任何开放的泛型基类。简单来说,我的意思是通过替换所有类型参数的唯一组合,从泛型定义中“实例化”一个具体类。
  • 除了 rdkliene 的代码没有出现您所观察到的问题,因此我们需要查看您的版本以找出差异。

标签: .net variables static


【解决方案1】:

你能显示一些代码吗?

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

【讨论】:

  • 感谢您的代码示例@rdkleine。它准确地展示了我的情况。
  • 它有但给出不同的结果?现在我真的对你的代码很感兴趣;)
  • 接受作为编写示例工作的答案 :) 我认为这与 ASP.NET 应用程序域再循环有关...
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2018-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多