2010-09-30 172 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 
}