引用了C#入门经典中的一段代码
Page176to177(中文第3版)
原代码用断点调试配合书中的范例容易给读者产生误解,如果没有亲手实践过的朋友可能会被书中提及的顺序所迷惑,因为用断点调试的时候顺序刚好是反过来的。
先说说书中的代码:
using System;
using System.Collections.Generic;
using System.Text;
namespace CA_Page176to177
{
public class MyBaseClass
{
public MyBaseClass()
{
}
public MyBaseClass(int i)
{
}
}
public class MyDerivedClass : MyBaseClass
{
public MyDerivedClass()
{
}
public MyDerivedClass(int i)
{
}
public MyDerivedClass(int i, int j)
{
}
}
class Program
{
static void Main(string[] args)
{
//Event1
MyDerivedClass myObj1 = new MyDerivedClass();
Console.WriteLine();
//Event2
MyDerivedClass myObj2 = new MyDerivedClass(4);
Console.WriteLine();
//Event3
MyDerivedClass myObj3 = new MyDerivedClass(4,8);
Console.WriteLine();
Console.ReadKey();
}
}
}
using System.Collections.Generic;
using System.Text;
namespace CA_Page176to177
{
public class MyBaseClass
{
public MyBaseClass()
{
}
public MyBaseClass(int i)
{
}
}
public class MyDerivedClass : MyBaseClass
{
public MyDerivedClass()
{
}
public MyDerivedClass(int i)
{
}
public MyDerivedClass(int i, int j)
{
}
}
class Program
{
static void Main(string[] args)
{
//Event1
MyDerivedClass myObj1 = new MyDerivedClass();
Console.WriteLine();
//Event2
MyDerivedClass myObj2 = new MyDerivedClass(4);
Console.WriteLine();
//Event3
MyDerivedClass myObj3 = new MyDerivedClass(4,8);
Console.WriteLine();
Console.ReadKey();
}
}
}
分别再每个构造函数处设置断点,然后按F5进行调试,针对Event1,先进入的是public MyDerivedClass()再进入public MyBaseClass(),而书中是用事件被调用的顺序进行描述的,
(书中写:事件的发生顺序为
1、System.Object.Object()
2、MyBaseClass.MyBaseClass()
3、MyDerivedClass.MyDerivedClass()
)
初学者可能对这个现象表示迷惑
因为程序的顺序是先3后2的。(其他的代码类似)
其实这个代码的实现过程是先上后下,就是先通过声明一个类,找到这个类的源头(先派生后基类),再从基类开始构造对象。
为了避免这样的疑惑,我还是写了这个DEMO。至少在不断点的时候你可以坚定书上的想法,等以后经验多了,就不会被迷惑了。如果你已经被迷惑了,那就赶快看看吧。
这个DEMO写得不好,原因是因为构造函数本不应该进行输出的(建议),但为了更简单明了,就直接写上Console.WriteLine()来解释迷惑。(理论上是不违反规则的)
下面就是DEMO的代码:
using System;
using System.Collections.Generic;
using System.Text;
namespace CA_Page176to177
{
public class MyBaseClass
{
public MyBaseClass()
{
Console.WriteLine("In MyBaseClass()");
}
public MyBaseClass(int i)
{
Console.WriteLine("In MyBaseClass(int i)");
}
}
public class MyDerivedClass : MyBaseClass
{
public MyDerivedClass()
{
Console.WriteLine("In MyDerivedClass()");
}
public MyDerivedClass(int i)
{
Console.WriteLine("In MyDerivedClass(int i)");
}
//public MyDerivedClass(int i, int j)
//{
// Console.WriteLine("In MyDerivedClass(int i,int j)");
//}
public MyDerivedClass(int i, int j)
: base(i)
{
Console.WriteLine("In MyDerivedClass(int i,int j):base(i)");
}
}
class Program
{
static void Main(string[] args)
{
//Event1
MyDerivedClass myObj1 = new MyDerivedClass();
Console.WriteLine();
//Event2
MyDerivedClass myObj2 = new MyDerivedClass(4);
Console.WriteLine();
//Event3
MyDerivedClass myObj3 = new MyDerivedClass(4,8);
Console.WriteLine();
Console.ReadKey();
}
}
}
using System.Collections.Generic;
using System.Text;
namespace CA_Page176to177
{
public class MyBaseClass
{
public MyBaseClass()
{
Console.WriteLine("In MyBaseClass()");
}
public MyBaseClass(int i)
{
Console.WriteLine("In MyBaseClass(int i)");
}
}
public class MyDerivedClass : MyBaseClass
{
public MyDerivedClass()
{
Console.WriteLine("In MyDerivedClass()");
}
public MyDerivedClass(int i)
{
Console.WriteLine("In MyDerivedClass(int i)");
}
//public MyDerivedClass(int i, int j)
//{
// Console.WriteLine("In MyDerivedClass(int i,int j)");
//}
public MyDerivedClass(int i, int j)
: base(i)
{
Console.WriteLine("In MyDerivedClass(int i,int j):base(i)");
}
}
class Program
{
static void Main(string[] args)
{
//Event1
MyDerivedClass myObj1 = new MyDerivedClass();
Console.WriteLine();
//Event2
MyDerivedClass myObj2 = new MyDerivedClass(4);
Console.WriteLine();
//Event3
MyDerivedClass myObj3 = new MyDerivedClass(4,8);
Console.WriteLine();
Console.ReadKey();
}
}
}
程序输出:
In MyBaseClass()
In MyDerivedClass()
In MyBaseClass()
In MyDerivedClass(int i)
In MyBaseClass(int i)
In MyDerivedClass(int i,int j):base(i)