zoukankan      html  css  js  c++  java
  • 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)

  • 相关阅读:
    windows cmd 快速编辑 模式
    navicat 15 学习版
    mysql 参数设置
    cat 高亮
    基本概念(4)——调试器
    基本概念(3)——cmake、qmake
    基本概念(2)——make、ninja、nmake、jom
    基本概念(1)——编译器
    LCP 19. 秋叶收藏集
    leetcode 117 填充每个节点的下一个右侧节点指针 II
  • 原文地址:https://www.cnblogs.com/volnet/p/556047.html
Copyright © 2011-2022 走看看