说白了构造函数就是用来初始化类的数据成员{因为C#语言具有类型安全的特质-->不能使用没有初始化的变量)}

在这里引用一下别人的总结,我觉得挺好的:

    构造函数是一种特殊的成员函数,它主要用于为对象分配存储空间,对数据成员进行初始化.

    构造函数具有一些特质:

(1).构造函数必须与类同名;

(2).构造函数没有返回类型,它可以带参数,也可以不带参数;

(3).一个类中可以有一个或多个构造函数,也就是说构造函数可以重载,从而提供初始化类对象的不同方法;

(4).声明类对象时,系统自动调用构造函数,构造函数不能被显式调用;

    (5).若在声明时未定义构造函数,系统会自动生成默认的构造函数,此时构造函数的函数体为空.

(6).静态构造函数,用static修饰,用于初始化静态变量,一个类只允许有一个静态构造函数,在类实例化时加载,这时修饰符public、private失去作用.

      {

静态构造函数既没有访问修饰符,也没有参数。

      在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。

      无法直接调用静态构造函数。在程序中,用户无法控制何时执行静态构造函数。

        静态构造函数的典型用途是:当类使用日志文件时,将使用这种构造函数向日志文件中写入项。

      静态构造函数在为非托管代码创建包装类时也很有用,此时该构造函数可以调用 LoadLibrary 方法。

      如果静态构造函数引发异常,运行时将不会再次调用该构造函数,并且在程序运行所在的应用程序域的生存期内,类型将保持未初始化}

(7)可以使用public、protected、private修饰符;

(8)引用父类构造时用():base()方法,引用自身重载的构造使用():this(int para);

这里代码举例就只列举  base和this的用法,也是别人的列子,拿来用的,我觉得说得挺通俗易懂的

public class ConstructorProgram
    {
       private string name;
       private int age;
  
       public ConstructorProgram():this("bell")
       {
           //Console.WriteLine("No Info Left.");
       }
       public ConstructorProgram(string name)
           :this("Simple Programmer",20)
        {
            this.name = name;
            Console.WriteLine("name=" + this.name);
        }
        public ConstructorProgram(string name, int age)
        {
            this.name = name;
            this.age = age;
            Console.WriteLine("name=" + this.name);
            Console.WriteLine("age=" + this.age);
        }

在上面的代码当中,可以看出来这里红色字体的this用来调用ConstructorProgram类的自身的构造函数。明白这句话的涵义,应该会明白执行结果了。
       public static void Main()
       {
           ConstructorProgram cp1= new ConstructorProgram("goal");
           ConstructorProgram cp2 = new ConstructorProgram();

}
    }

运行结果:

name=Simple Programmer

age=20

name=goal

name=Simple Programmer

age=20

name=bell

在上面的代码当中,可以看出来这里红色字体的this用来调用ConstructorProgram类的自身的构造函数。明白这句话的涵义,应该会明白执行结果了。

接着下面的代码如下:

public  class ConstructorProgram1
    {
      private string name;
      private int age;
      public ConstructorProgram1()
      {
          Console.WriteLine("No Info Left");
      }
      public ConstructorProgram1(string name)
      {
          this.name = name;
          Console.WriteLine("name=" + this.name);
      }
      public ConstructorProgram1(string name, int age)
      {
          this.name = name;
          this.age = age;
          Console.WriteLine("name=" + this.name);
          Console.WriteLine("age=" + this.age);
      }

}

public  class ConstructorProgram : ConstructorProgram1
    {

public ConstructorProgram()
      {
          //Console.WriteLine("sdfsdf");
      }
      public ConstructorProgram(string name)
          : base("goalbell",20)
      {
          Console.WriteLine("name=" + name);
      }

public static void Main() 
      {
          ConstructorProgram cp = new ConstructorProgram("Programmer");
      }
      
    }

运行结果如下:

name=goalbell

age=20

name=Programmer

可以看出上面的代码,派生类中的base调用了父类(基类)的构造函数了,但是如果不提供初始化(即把 : base("goalbell",20)
不要)指向基类的构造函数的话,它会执行基类中没有参数的构造函数。

会得到如下结果:

name=goalbell

age=20

name=Programmer

No Info Left

也就是说BASE是对父类的引用,而THIS是对类本身自己的引用。

在看下下面的代码,(基类和派生类中的构造函数关系)

using System;
namespace Zjw.Csharp
{
 public  class ConstructorProgram1
    {
      private string name;

public ConstructorProgram1()
      {
          Console.WriteLine("No Info Left");
      }
      public ConstructorProgram1(string name)
      {
          this.name = name;
          Console.WriteLine("name=" + this.name);
      }

}
public class ConstructorProgram:ConstructorProgram1
    {
       private string name;
       private int age;
  
       public ConstructorProgram():this("bell")
       {
           //Console.WriteLine("No Info Left.");
       }
       public ConstructorProgram(string name)
           :this("Simple Programmer",20)
        {
            this.name = name;
            Console.WriteLine("name=" + this.name);
        }
        public ConstructorProgram(string name, int age)
        {
            this.name = name;
            this.age = age;
            Console.WriteLine("name=" + this.name);
            Console.WriteLine("age=" + this.age);
        }

public static void Main()
       {
           ConstructorProgram cp1= new ConstructorProgram("goal");
           ConstructorProgram cp2 = new ConstructorProgram();
          
           Console.ReadLine();

}
    }

}

执行结果是

No Info Left

name=Simple Programmer

age=20

name=goal

No Info Left

name=Simple Programmer

age=20

name=bell

可以得到的结论是 派生类先调用父类的构造函数进行初始化,再调用继承类的构造函数,如果没有在继承类中指明父类的构造函数,则默认调用父类中没有参数的构造函数,然后调用继承类的构造函数。

转自 ;https://www.cnblogs.com/siyecao/archive/2012/05/17/2506375.html

C#--构造函数的理解的更多相关文章

  1. 转 关于C#中派生类调用基类构造函数的理解

    关于C#中派生类调用基类构造函数的理解 .c#class       本文中的默认构造函数是指在没有编写构造函数的情况下系统默认的无参构造函数 1.  当基类中没有自己编写构造函数时,派生类默认的调用 ...

  2. C++ 类的多态一(virtual关键字--构造函数深刻理解)

    //virtual关键字--构造函数深刻理解 #include<iostream> using namespace std; /* C语言编译器,c++编译器全部是静态链编,就是一段一段代 ...

  3. C++拷贝构造函数 的理解

    #include <iostream> using namespace std; //拷贝构造函数的理解 class Point { public: Point(); Point(int ...

  4. js之构造函数的理解

    在JavaScript中,创建对象的方式包括两种:对象字面量和使用new表达式.对象字面量是一种灵活方便的书写方式,例如:   1 2 3 4 5 6 var o1 = {     p:”I’m in ...

  5. java 中构造函数 的理解

    构造方法就是与类同名的那个方法,它的作用是可以用来初始化 class Person{ public Person(String n,int a) {//构造方法 name = n; age = a; ...

  6. 关于C#中派生类调用基类构造函数的理解

    (1)当基类中没有自己编写的构造函数时,派生类默认条用基类的构造函数 (2)当基类中有自己编写的构造函数时,要在基类中添加无参的构造函数 public class MyBaseClass { publ ...

  7. 对C# 构造函数的理解

    C#构造函数是在创建给定类型的对象时执行的类方法. 构造函数具有与类相同的名称,它通常初始化新对象的数据成员.不带参数的构造函数称为“默认构造函数”. 无论何时,只要使用 new 运算符实例化对象,并 ...

  8. javascript构造函数的理解

    构造函数是在javascript文档的创建对象当中提到的,主要目的是为了解决代码复用,能够大量产生同类型而多作用的方法 在javascript中给出了几种创建对象的模式: 1.对象字面量 例: var ...

  9. 构造函数的理解(构造函数与 init 方法)

    0. 构造函数与 init 方法 构造方法内部禁止添加任何业务逻辑,如果有业务逻辑,请放在 init 方法中: 1. 构造函数的参数 以下为一个堆实现优先队列(堆的实现借助完全二叉树,而完全二叉树又可 ...

随机推荐

  1. 学习-工作:GTD

    ylbtech-学习-工作:GTD GTD就是Getting Things Done的缩写,翻译过来就是“把事情做完”,是一个管理时间的方法.GTD的核心理念概括就是必须记录下来要做的事,然后整理安排 ...

  2. window的三大功能,行内样式获取的讲解 getcomputerStyle

    window的三大功能: js引擎 dom渲染 获取行内中css的属性: chrome和Firefox加上 ie9+(所谓的高级浏览器)用的方法: window.getComeputerStyle(d ...

  3. github中fork的使用

    转载https://www.cnblogs.com/patchouli/p/6511251.html 由于git的权限控制功能比较弱,如果想给某个项目提供代码除了直接获得项目的push权限外,gith ...

  4. Activity的启动模式--总结

    3. Activity的任务栈Task以及启动模式与Intent的Flag详解? 2,Activity次级页面和主页间来回跳转,防止重复创建Activity实例 1, activity的启动模式: / ...

  5. RHEL7安装配置VNC

    RHEL7安装配置VNC 作者:Eric 微信:loveoracle11g 安装配置VNC服务程序 [root@zhouwanchun yum.repos.d]# cd ~ [root@zhouwan ...

  6. Python基础知识(五)

    # -*- coding: utf-8 -*-# @Time : 2018-12-25 19:31# @Author : 三斤春药# @Email : zhou_wanchun@qq.com# @Fi ...

  7. sas 解析json

    代码: proc ds2;data _null_;    method init();        dcl package json j();        dcl int rc tokenType ...

  8. Linux下Mysql自启动

    如果你都是按照默认配置安装的那么只要按照如下步骤就可以了 1.cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql   将服 ...

  9. 排序算法的python实现

    几个排序算法 几个排序算法 冒泡排序 选择排序 插入排序 快速排序 quick sort 冒泡排序

  10. python+bs4+urllib

    # -*- coding: utf-8 -*- # # # from bs4 import BeautifulSoup import urllib2 import sys reload(sys) sy ...