代码改变世界

C#继承中的静态构造函数和base关键字使用

2011-09-07 11:10  DylanChan  阅读(865)  评论(0编辑  收藏  举报

静态构造函数是C#的一个新特性,其实好像很少用到。不过当我们想初始化一些静态变量的时候就需要用到它了。这个构造函数是属于类的,而不是属于哪里实例的,就是说这个构造函数只会被执行一次。也就是在创建第一个实例或引用任何静态成员之前,由.NET自动调用。

在使用静态构造函数的时候应该注意几点:

  ◇  静态构造函数既没有访问修饰符,也没有参数。因为是.NET调用的,所以像public和private等修饰符就没有意义了。
  ◇  是在创建第一个类实例或任何静态成员被引用时,.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
             */
        }
    }