public class Rational
{
protected static Rational one;
public static Rational One
{
get { return one; }
}
protected static Rational zero;
public static Rational Zero
{
get { return zero; }
}
{
public int N { get; set; }
public int M { get; set; }
static Rational()
{
one = new Rational(1, 1);
zero = new Rational(0, 1);
}
public Rational(int n, int m)
{
N = n;
M = m;
}
public override string ToString()
{
return string.Format("{0}/{1}", N, M);
}
}
static void Main(string[] args)
{
Rational r1 = Rational.One;//r1 is 1/1
Rational r2 = Rational.Zero;//r2 is 0/1
Rational r = new Rational(1, 2);
Rational r3 = Rational.One;//r3 is 1/1
Rational r4 = Rational.Zero;//r4 is 0/1
}
但是:
public class Ra
{
protected static Rational one;
public static Rational One
{
get { return one; }
}
protected static Rational zero;
public static Rational Zero
{
get { return zero; }
}
}
public class Rational:Ra
{
public int N { get; set; }
public int M { get; set; }
static Rational()
{
one = new Rational(1, 1);
zero = new Rational(0, 1);
}
public Rational(int n, int m)
{
N = n;
M = m;
}
public override string ToString()
{
return string.Format("{0}/{1}", N, M);
}
}
static void Main(string[] args)
{
Rational r1 = Rational.One;//r1 is null
Rational r2 = Rational.Zero;//r2 is null
Rational r = new Rational(1, 2);
Rational r3 = Rational.One;//r3 is 1/1
Rational r4 = Rational.Zero;//r4 is 0/1
}
字段在类中,静态构造函数会在第一次调用属性之前调用初始化静态字段,但是字段继承于基类,静态构造不会在调用属性之前初始为,而是在实例化类之后初始化,什么原因,什么解决办法?
因为static 和Instance一点关系都没有,你在Rational r1 = Rational.One;//r1 is null 的时候,其实是
Rational r1 = Ra.One;//r1 is null,One属于Ra类的成员,JIT根本不需要加载Rational的任何代码,因此Rational中的Static根本不会执行。