玩转C科技.NET

从学会做人开始认识这个世界!http://volnet.github.io

导航

DEMO[C#]关于类构造函数的调用顺序的一点补充[针对书C#入门经典所举范例的不足]

通知:新增MSN群帐号 www.msdn@hotmail.com,欢迎大家进入讨论交流!(像添加好友一样地添加该群)

引用了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();
        }

    }

}


分别再每个构造函数处设置断点,然后按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();
        }

    }

}


程序输出:

In MyBaseClass()
In MyDerivedClass()

In MyBaseClass()
In MyDerivedClass(int i)

In MyBaseClass(int i)
In MyDerivedClass(int i,int j):base(i)

posted on 2006-11-10 01:16  volnet(可以叫我大V)  阅读(1582)  评论(3编辑  收藏  举报

使用Live Messenger联系我
关闭