"派生类实例化时要首先要执行基类的静态构造函数"这句话对吗?
例如: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#