说白了构造函数就是用来初始化类的数据成员{因为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. PostgreSQL中的group by

    问题描述:今天使用了PostgerSQL查询统计一下相关信息,发现 报错了 SELECT * FROM "public"."dc_event_data" WHE ...

  2. 事件之Touch 事件的分发和消费机制

    Android 中与 Touch 事件相关的方法包括:dispatchTouchEvent(MotionEvent ev).onInterceptTouchEvent(MotionEvent ev). ...

  3. [UE4]在当前角色正前方2米处生成一个Actor

  4. [UE4]创建KillInfoPanel

    不设置UniformGrid的尺寸,改成在父级“WB_FPPCharacter”中设置尺寸,这样可以更方便的控制.

  5. Android Studio启动后出现cannot bind to 127.0.0.1:5037 10048的解决办法

    第一次:先连接测试手机,然后启动Android studio时出现下面的弹框,网上查找资料说是360手机助手导致的,但是发现没有安装360手机助手只有360,卸载360后再启动Android stud ...

  6. Unicode String to a UTF-8 TypedArray Buffer in JavaScript

    https://coolaj86.com/articles/unicode-string-to-a-utf-8-typed-array-buffer-in-javascript/

  7. UE4中使用URL图片

    转自:http://www.52vr.com/article-911-1.html

  8. CentOS7.3编译hadoop2.7.3源码

    在使用hive或者是kylin时,可以选择文件的压缩格式,但是这个需要有hadoop native库的支持,默认情况下,hadoop官方发布的二进制包中是不包含native库的,所以无法使用一些压缩相 ...

  9. MVP与MVC的区别

    MVP的主要思想就是解耦View和Model 先大致从图上看一下MVP和MVC又什么不同: MVC: M : Model 数据模型,就是对数据的封装和保存: V : View 视图界面,相当于布局文件 ...

  10. JQuery加载列表实现动画滚动(自上而下挤)

    这个例子是jquery动态加载列表,并通过定时刷新,实现其循环滚动效果的一个例子. 1.HTML代码: <div class="fake-table"> <li ...