有人可以解释为什么静态属性为空吗?
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;
}
}
答案 0 :(得分:6)
那是因为当你写Cc.P1
时,你实际上指的是Ca.P1
,因为它是声明它的地方(因为P1
是静态的,它不参与多态)。因此,尽管出现了,但您的代码根本没有使用Cc
类,并且不会执行Cc
静态构造函数。
答案 1 :(得分:0)
尝试以下方法:
string s = Cc.P1; // is null
Cc c = new Cc();
s = Cc.P1; // is it still null
如果P1不再为空,那是因为访问静态P1(在Ca中)不会导致Cc的静态实例触发(因此在静态构造函数中赋值)。
答案 2 :(得分:0)
如果你真的想要这个值:
new Cc(); // call the static constructor
string s = Cc.P1; // not null now
答案 3 :(得分:0)
您在代码中滥用了一些OOD原则。例如,你在你的类中混合静态行为(女巫就像Singleton设计模式)和多态(你使用抽象基类但没有任何基类接口)。因为我们没有“静态多态性”这样的东西,所以我们应该将这两个角色分开。
如果您更详细地描述了您要解决的问题,可能会收到更准确的答案。
但无论如何你可以实现这样的东西:
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
}