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()函数来对类的成员进行实例化(初始化),而在类中仅对成员进行声明,虽然在类定义声明变量的时候,可以在语法 上对其进行实例化,但这显然不是一种概念清晰的做法。类的所有成员实例都是在类的实例被创建时才被创建的,推荐在程序的书写上也体现出这种规则。

  • 相关阅读:
    Redis服务器配置
    Spark History Server配置使用
    CentOS7.3安装Nginx
    U盘安装CentOS7的最终解决方案
    iconfont_3种引用方式
    div+css 让一个小div在另一个大div里面 垂直居中
    JavaScript数组方法
    addEventListener()和removeEventListener()
    js获取网页高度
    Linux修改命令行样式
  • 原文地址:https://www.cnblogs.com/smwikipedia/p/1125580.html
Copyright © 2011-2022 走看看