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


    看如下程序:

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

  • 相关阅读:
    【洛谷 p3386】模板-二分图匹配(图论)
    【洛谷 p3374】模板-树状数组 1(数据结构)
    【poj 3167】Cow Patterns(字符串--KMP匹配+数据结构--树状数组)
    【洛谷 p3368】模板-树状数组 2(数据结构)
    【洛谷 P3385】模板-负环(图论--spfa)
    【poj 3080】Blue Jeans(字符串--KMP+暴力枚举+剪枝)
    【poj 2185】Milking Grid(字符串--KMP+问题分解)
    【poj 3461】Oulipo(字符串--KMP)
    正则表达式
    表单
  • 原文地址:https://www.cnblogs.com/smwikipedia/p/1125580.html
Copyright © 2020-2023  润新知