在读这一节的类容之前,我觉得构造函数我都用了至少几千上万遍了,还会有什么新鲜的东西吗?经过仔细的阅读这一节,发现这样一个小小的

主题,我不知道的并且对我们写程序至关重要的原来还有这么多...

    1. 并不是所有新对象的创建都需要用到构造函数
       
Object类型定义了一个实例方法:MemberwiseClone,该方法的功能是为新对象分配内存,然后将当前实例进行浅拷贝到新的内存块中。这个过程便不会调用

构造函数。

 

    2. 便捷的内联成员初始化

        首先贴一段我写了无数遍的代码:
       

class Person
{
        private string _name = "Jensen";

        private int _age = 26;

        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

        public int Age
        {
            get { return _age; }
            set { _age = value; }
        }
}

 写过C++程序的都知道,在C++中是不能在定义类成员的时候同时对其进行初始化的。(一般在构造函数中进行初始化)

其实在C#中规则是一样的,只不过C#编译器比较友好。它允许内联对成员进行始化,然后编译的时候把初始化代码插入到所有构造函数中。(如果没有定义会生成一个默认

的无参构造函数)。

看一下IL代码证实一下:(我没有定义构造函数,因此编译器生成了一个默认的)

 

.method public hidebysig specialname rtspecialname 
        instance void  .ctor() cil managed
{
  // Code size       27 (0x1b)
  .maxstack  8
  IL_0000:  ldarg.0
  IL_0001:  ldstr      "Jensen"
  IL_0006:  stfld      string TestApp.Person::_name
  IL_000b:  ldarg.0
  IL_000c:  ldc.i4.s   26
  IL_000e:  stfld      int32 TestApp.Person::_age
  IL_0013:  ldarg.0
  IL_0014:  call       instance void [mscorlib]System.Object::.ctor()
  IL_0019:  nop
  IL_001a:  ret
// end of method Person::.ctor

可以很清楚的看到,IL_0001至IL_000e是编译器插入到构造函数中的成员初始化代码,成员的值便是我们通过内联的方法所设定的值。

我们可以尝试定义多个构造函数:

class Person
{
        private string _name = "Jensen";

        private int _age = 26;

        public Person()
        {

        }

        public Person(string name, int age)
        {
            _name = name;
            _age = age;
        }

        public Person(string name)
        {
            _name = name;
        }

        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

        public int Age
        {
            get { return _age; }
            set { _age = value; }
        }
}

相关文章: