2011-04-18 77 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

相關問題