zoukankan      html  css  js  c++  java
  • 关于类成员变量的声明和实例化的时机

    看如下程序:

    程序1:

    namespace ClassMemberDeclaration
    {
        class Class1
        {
            Class2 class2 = new Class2();
            //这是在声明成员对象的时候同时实例化。
            public Class1()
            {
                //class2 = new Class2();
                //这是在类定义的时候仅声明成员对象,而在新建类对象实例的时候,再对类内部的对象成员统一实例化。
                class2.output();
            }
        }
    }

    程序2:

    namespace ClassMemberDeclaration
    {
        class Class2
        {
            int b=22;
            //这是 在声明成员变量的时候同时实例化(初始化)。
            public Class2()
            {
                //b = 22;
                //这是在成员变量定义的时候仅声明,而在新建类对象实例的时候,
                //再通过类的构造函数对类内部的成员统一初始化。
            }
            public void output()
            {
                Console.WriteLine(b.ToString());
            }
        }
    }

    声明和实例化(初始化)是不同的动作,处于概念上的清晰,推荐把二者分开,看下面一段Visual Studio 2008自动生成的代码:

    程序3:

    namespace WebWFLib
    {
     partial class Workflow1
     {
      #region Designer generated code
      
      /// <summary>
      /// Required method for Designer support - do not modify
      /// the contents of this method with the code editor.
      /// </summary>
            [System.Diagnostics.DebuggerNonUserCode]
      private void InitializeComponent()
      {
                this.CanModifyActivities = true;
                this.codeDoDivision = new System.Workflow.Activities.CodeActivity();//实例化
                this.sequenceActivity1 = new System.Workflow.Activities.SequenceActivity();//实例化

                //
                // codeDoDivision
                //
                this.codeDoDivision.Name = "codeDoDivision";
                this.codeDoDivision.ExecuteCode += new System.EventHandler(this.codeDoDivision_ExecuteCode);
                //
                // sequenceActivity1
                //
                this.sequenceActivity1.Activities.Add(this.codeDoDivision);
                this.sequenceActivity1.Name = "sequenceActivity1";
                //
                // Workflow1
                //
                this.Activities.Add(this.sequenceActivity1);
                this.Name = "Workflow1";
                this.CanModifyActivities = false;

      }

      #endregion

            private CodeActivity codeDoDivision;                     //声明
            private SequenceActivity sequenceActivity1;          //声明

        }
    }

    在微软自动生成的代码中,都是通过在类的构造函数中调用一个private void InitializeComponent()函数来对类的成员进行实例化(初始化),而在类中仅对成员进行声明,虽然在类定义声明变量的时候,可以在语法 上对其进行实例化,但这显然不是一种概念清晰的做法。类的所有成员实例都是在类的实例被创建时才被创建的,推荐在程序的书写上也体现出这种规则。

  • 相关阅读:
    软件体系架构复习要点
    Operating System on Raspberry Pi 3b
    2019-2020 ICPC North-Western Russia Regional Contest
    2019 ICPC ShenYang Regional Online Contest
    2019 ICPC XuZhou Regional Online Contest
    2019 ICPC NanChang Regional Online Contest
    2019 ICPC NanJing Regional Online Contest
    Codeforces Edu Round 72 (Rated for Div. 2)
    Codeforces Round #583 (Div.1+Div.2)
    AtCoder Beginning Contest 139
  • 原文地址:https://www.cnblogs.com/smwikipedia/p/1125580.html
Copyright © 2011-2022 走看看