关于类成员变量的声明和实例化的时机

看如下程序:

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

原文地址:https://www.cnblogs.com/smwikipedia/p/1125580.html