当前位置:编程学习 > C#/ASP.NET >>

"派生类实例化时要首先要执行基类的静态构造函数"这句话对吗?

例如: 
  public   class   A 
        { 
                static   A()   {   Console.WriteLine( "a ");   } 
        } 
        public   class   B   :   A 
        { 
                static   void   Main() 
                { 
                        B   kkk   =   new   B(); 
                } 
        } 
例子运行结果为a。 
但是,下面这个例子: 
public   class   A 
        { 
                static   A()   {   Console.WriteLine( "a ");   } 
        } 
        public   class   B   :   A 
        { 
                
                B   kk   =   new   B(); 
                static   void   Main() 
                { 
                        B   kkk   =   new   B(); 
                } 
        } 
例子运行结果:不是先输出a再执行死循环,而是直接死循环。 
那么为什么这个例子不是先执行静态构造函数,而是直接执行了   B   kk   =   new   B()语句呢? 
--------------------编程问答-------------------- 顺便再问问:为什么下面代码执行结果为a呢?
public class A
    {
        static A() { Console.WriteLine("a"); }
    }
    public class B : A
    {

        static B kk = new B();
        static void Main()
        {
            B kkk = new B();
            
        }
    } --------------------编程问答-------------------- 大家都说句话好吗?^_^ --------------------编程问答-------------------- 请大家回答啊,在线等 --------------------编程问答-------------------- 1.
"派生类实例化时要首先要执行基类的静态构造函数"这句话对吗? 
-----------------------------------
不对,应当说基类的静态构造函数,在第一次使用这个基类的时候会执行!也就是说即使有无数个实例,这个基类构造函数也只会执行一次!
同时,LZ要知道,静态成员是属于类本身的,一个类无论有多少个实例,静态成员并不属于实例,而是唯一的.
不知道这么说是否清楚,呵
2.

                public class A   
                {   
                  static A(){ Console.WriteLine("a");}   
                }   
                public class B:A   
                {   
                  static void Main()   
                  {   
                     B kkk=new B();   
                  }   
                }   

这段代码,对于一个控制台应用程序,Main()方法是入口点,所以执行Main()方法的代码,当执行B kkk=new B()时,由于是第一次调用A(B是从A派生的),所以执行静态构造函数,输出了"a"
3.

                public class A   
                {   
                  static A(){ Console.WriteLine("a");}   
                }   
                public class B:A   
                {   
                  static kk=new B();   
                  static void Main()   
                  {   
                     B kkk=new B();   
                  }   
                }   

这段也是一样,执行Main()方法的代码B kkk=new B(),创建B类的新实例kkk,由于B类有一个类成员kk,并且这个类成员是直接创建实例,因此会先执行kk=new B(),而不是先执行A类的静态构造函数,当进入死循环,就永远不会输出"a"了.
4.

                public class A   
                {   
                  static A(){ Console.WriteLine("a");}   
                }   
                public class B:A   
                {   
                  static B kk=new B();   
                  static void Main()   
                  {   
                     B kkk=new B();   
                  }   
                }   

这段代码与上面一段只相差在B类的成员kk,在这段代码中,kk是一个静态成员,因此只会执行一次,不会陷入死循环,其执行顺序是:当程序开始时,找到了B类的静态入口点Main()方法,而B类有一个静态成员kk,调用B类首先要初始化其静态成员kk,因此会先执行static B kk=new B(),调用A,输出"a",然后才执行静方法Main()中的代码B kkk=new B(),这时候不再输出a了.
--------------------编程问答-------------------- 恩,楼上一说我就明白了,看来我一直理解错了。先执行的是 B kk=new B()啊,我始终固执认为是先执行基类构造函数呢,haha.


再请教boblaw一下:
1.老师说过C#类成员有字段、方法、属性和事件。那么在类中直接写的B kk=new B()这个语句就是属于方法对吗?
2.看看这个帖子,也是我问的:
http://topic.csdn.net/u/20071103/14/d38f4e7b-d050-4c36-85ce-72e56e88cef5.html

谢谢boblaw了^_^ --------------------编程问答-------------------- B   kk=new   B()
---------
呵呵,准确的说应该是一行代码,声明一个属性kk,并对他进行赋值. --------------------编程问答-------------------- boblaw 的意思是说C#类成员除了字段、方法、属性和事件还可以有别的类成员?举举例子,其它类成员的例子.谢谢 --------------------编程问答-------------------- 字段、方法、属性和事件还可以有别的类成员
-------------------
晕,我什么时候说了? --------------------编程问答-------------------- ^_^,继续问问 --------------------编程问答-------------------- 学习到了,顶一下
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,