2010-09-30 173 views
2

任何人都可以解釋爲什麼靜態屬性爲空?靜態屬性抽象類

class Program 
{ 
    static void Main(string[] args) 
    { 
     string s = Cc.P1; // is null 
    } 
} 

public class Cc 
    : Ca 
{ 
    static Cc() 
    { 
     P1 = "Test"; 
    } 
} 

public abstract class Ca 
{ 
    public static string P1 
    { 
     get; 
     protected set; 
    } 
} 

回答

6

這是因爲當你寫Cc.P1,你實際上指的是Ca.P1,因爲這是在聲明(因爲P1是靜態的,它不參與多態)。所以儘管表面上,你的代碼根本不使用Cc類,並且不執行靜態構造函數。

+1

在一個側面說明,這就是爲什麼ReSharper的會罵你,如果你嘗試做這樣的事情(通過導出指靜態字段類)。 – 2010-09-30 09:58:14

+0

我讀過這個問題:http://stackoverflow.com/questions/774181/why-cant-i-inherit-static-classes,你知道我怎麼能做到這一點?靜態屬性不支持接口 – fravelgue 2010-09-30 10:56:30

+1

@fravelgue,你怎麼能做什麼?你沒有解釋你正在嘗試做什麼... – 2010-09-30 12:03:19

0

嘗試以下操作:

string s = Cc.P1; // is null 
Cc c = new Cc(); 
s = Cc.P1; // is it still null 

如果P1不再爲空,這是因爲訪問靜態P1(單位),不會造成Cc的靜態實例火(因此分配中的價值靜態構造函數)。

+0

我不想創建一個對象。 – fravelgue 2010-09-30 10:41:19

+0

@fravelgue:是的,抱歉,我明白你想要做什麼 - 我只是想說明爲了得到你想要的工作所需的電話。正如我自己和其他人所說的那樣,如果只訪問「Ca」上的靜態屬性P1,「Cc」上的靜態構造函數將不會觸發。它不是一個錯誤,它的.NET框架如何工作。如果你真的需要這樣做,那麼你需要找到另一種方式來做到這一點恐怕 – 2010-09-30 11:03:26

+0

thx非常適合你的反應,但它看起來靜態繼承是不可能的在C#中,並沒有解決方案。 – fravelgue 2010-09-30 11:23:51

0

如果你真的想要的值:

new Cc(); // call the static constructor 
string s = Cc.P1; // not null now 
0

你在你的代碼濫用一些OOD的原則。例如,你混合了你的類的靜態行爲(女巫就像Singleton設計模式)和多態性(你使用抽象基類但沒有任何基類接口)。而且因爲我們沒有像「Static Polymorphism」這樣的東西,我們應該分開這兩個角色。

如果您更詳細地描述了您嘗試解決什麼問題,也許您會收到更準確的答案。

但無論如何,你可以實現這樣的事情:

public class Cc : Ca 
{ 
    private Cc() 
     : base("Test") 
    { 
     //We may call protected setter here 
    } 

    private static Ca instance = new Cc(); 
    public static Ca Instance 
    { 
     get { return instance; } 
    } 
} 

public abstract class Ca 
{ 
    protected Ca(string p1) 
    { 
     P1 = p1; 
    } 

    //You may use protected setter and call this setter in descendant constructor 
    public string P1 
    { 
     get; 
     private set; 
    } 
} 


static void Main(string[] args) 
{ 
    string s = Cc.Instance.P1; // is not null 
}