2011-04-18 41 views
1

该问题特别关注.Net。在其派生类中共享的基类中的静态成员

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

我目前的知识说通常静态变量是在派生类之间共享的,除非基类是Generic。如果基类是通用的,那么将为类型参数的每个唯一组合创建该类的唯一副本,并且该类的每个副本以及该特定副本的派生类都与基类共享同一个satatic变量。

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

编辑:

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

  1. 我把一个断点放在第一次命中断点时变量和它的值被更新。
  2. 下一次命中断点时,变量已恢复为其旧值并再次初始化。这是一个私有变量,只在一个地方更改。

我的猜测可能是应用程序的应用程序域已经回收或以某种方式,否则该类从内存中卸载。我仍在调查,但谢谢大家的回复。

+4

如果您可以构建一个简短但完整的代码示例,那么我们可以计算出正在发生的事情,或者尝试这样做,您可能会发现问题的原因。 – 2011-04-18 10:20:23

+0

我唯一的猜测是如果静态是用ThreadStaticAttribute装饰的,而且你正在从不同的线程观察它。 – 2011-04-18 10:22:44

+0

您对泛型类的评论意味着混淆。具体的泛型类不是从假定的开放泛型“基类”中“派生出来的”。 – AakashM 2011-04-18 10:37:25

回答

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

+0

感谢您的代码示例@rdkleine。它完全展示了我的情况。 – 2011-04-18 12:33:05

+0

它确实会给出不同的结果?现在我真的对你的代码感兴趣;) – 2011-04-18 13:17:48

+0

接受作为书面例子:)的努力的答案我认为它必须与ASP.NET应用程序域重新循环... – 2011-04-21 19:47:20

1

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

+1

downvote的原因是什么? – 2011-04-18 10:25:21

相关问题