C#继承中的静态构造函数和base关键字使用
2011-09-07 11:10 DylanChan 阅读(865) 评论(0) 编辑 收藏 举报静态构造函数是C#的一个新特性,其实好像很少用到。不过当我们想初始化一些静态变量的时候就需要用到它了。这个构造函数是属于类的,而不是属于哪里实例的,就是说这个构造函数只会被执行一次。也就是在创建第一个实例或引用任何静态成员之前,由.NET自动调用。
在使用静态构造函数的时候应该注意几点:
◇ 静态构造函数既没有访问修饰符,也没有参数。因为是.NET调用的,所以像public和private等修饰符就没有意义了。
◇ 是在创建第一个类实例或任何静态成员被引用时,.NET将自动调用静态构造函数来初始化类,也就是说我们无法直接调用静态构造函数,也就无法控制什么时候执行静态构造函数了。
◇ 一个类只能有一个静态构造函数。
◇ 无参数的构造函数可以与静态构造函数共存。尽管参数列表相同,但一个属于类,一个属于实例,所以不会冲突。
◇ 最多只运行一次。
◇ 静态构造函数不可以被继承。
◇ 如果没有写静态构造函数,而类中包含带有初始值设定的静态成员,那么编译器会自动生成默认的静态构造函数。
◇ 是在创建第一个类实例或任何静态成员被引用时,.NET将自动调用静态构造函数来初始化类,也就是说我们无法直接调用静态构造函数,也就无法控制什么时候执行静态构造函数了。
◇ 一个类只能有一个静态构造函数。
◇ 无参数的构造函数可以与静态构造函数共存。尽管参数列表相同,但一个属于类,一个属于实例,所以不会冲突。
◇ 最多只运行一次。
◇ 静态构造函数不可以被继承。
◇ 如果没有写静态构造函数,而类中包含带有初始值设定的静态成员,那么编译器会自动生成默认的静态构造函数。
◇ 静态构造函数的执行顺序 派生类 --> 基类
base关键字
◇ 其用于在派生类中实现对基类公有或者受保护成员的访问,但是只局限在构造函数、实例方法和实例属性访问器中。
◇ 调用基类上已被其他方法重写的方法。
◇ 指定创建派生类实例时应调用的基类构造函数。
//************ 定义基类Animal ************// public class Animal { static string baseClassName; protected string _skincolor; //************ 基类Animal中的静态构造函数 ************// static Animal() { baseClassName = "动物"; Console.WriteLine(baseClassName); Console.WriteLine(); } public Animal() { Console.WriteLine("一只动物出生了!!!"); Console.WriteLine(); } protected Animal(string skincolor) { this._skincolor = skincolor; Console.WriteLine("这只动物的颜色为:" + this._skincolor); Console.WriteLine(); } } //************ 定义子类Horse继承父类Animal ************// public class Horse : Animal { //************ 派生类Horse中的静态函数 ************// static Horse() { Console.WriteLine("静态:一头小马驹出生了。。。。"); Console.WriteLine(); } public Horse() { _skincolor = "赤兔马的红"; Console.WriteLine("一头小马驹出生了。。。。"); Console.WriteLine("这头小马驹的颜色为:" + this._skincolor); Console.WriteLine(); } double _weight; string _sex; public Horse(string skincolor, string sex, double weight) : base(skincolor) { _skincolor = skincolor; _weight = weight; _sex = sex; //base._skincolor=skincolor; Console.WriteLine("一头小马驹出生了。。。。"); Console.WriteLine("这头小马驹为:" + this._sex); Console.WriteLine("这头小马驹的颜色为:" + this._skincolor); Console.WriteLine("这头小马驹的体重为:" + this._weight); Console.WriteLine(); } } //************ 定义测试类Demo ************// public class Demo { public static void Main(string[] args) { //Animal A = new Animal(); //Horse h = new Horse(); Horse hh = new Horse("纯白色", "雄性", 320); //Horse hhh = new Horse("纯色", "雌性", 120); } }
静态构造函数的执行顺序
class A { public static int X; static A() { X = B.Y + 1; } } class B { public static int Y = A.X + 1; static B() { } static void Main() { Console.WriteLine("X={0},Y={1}", A.X, B.Y); //输出结果:X=1,Y=2 /* * Main()函数在Class B中,执行点指向 public static int Y = A.X + 1;这句初始化Y的值为0 * 因为此句含有A.X,执行点跳到 * static A() { X = B.Y + 1; } * 并初始化X的值为0;接着向下执行X = B.Y + 1;后,X的值为1 * 然后再次执行public static int Y = A.X + 1;Y的值为2 */ } }