C#类的学习笔记之C#构造函数

发布时间:2020-11-27编辑:脚本学堂
本文介绍下,C#类中的构造函数,有需要的朋友,可以参考下。

1,如果没有提供构造函数,编译器会在后台创建一个默认的构造函数,这是一个非常基本的构造函数,只能把成员字段初始化为标准默认值。

2,C#中的基本字段,默认情况下初始化为0,而C++中的基本字段不进行初始化,不需要像C++那样频繁的编写构造函数。

3,可以为构造函数提供任意多的重载,但如果提供了构造函数,编译器就不会自动提供默认的构造函数,这时使用无参数的构造函数实例化对象会报错。
如:类Class1只有一个带有一个参数的构造函数 ,那么 Class1 cls=new Class1()会报错。
 
4,如下:如果不为类MyNumber定义任何公共或受保护构造函数,那么就不能使用new运算符在外部代码中实例化该类
 

复制代码 代码示例:
public class MyNumber
{
  private int number;
  private MyNumber(int number)
  {
      this.number = number;
  }
}

在如下情况中使用:
1)、类仅用于静态成员或属性
2)、希望类通过调用某个静态成员函数来实例化

5,可以给类创建无参数的静态构造函数,这种构造函数只执行一次。
如这样定义构造函数static MyNumber() { Console.WriteLine("123"); }的话,那么无论怎样用new 生成实例,构造函数都只执行一次。

※注意
1),静态构造函数是在加载类时执行,而无参数构造函数是在创建实例时执行,所以可以共存。
2),静态构造函数没有修饰符public static MyNumber() { Console.WriteLine("123"); },这样定义会报错。
3),静态构造函数不能带参数
4),一个类中静态构造函数只能有一个
5),静态构造函数只能访问类的静态成员,不能访问实例成员

6,构造函数的初始化器
如下类A,有两个构造函数,可以考虑用构造函数的初始化器
 

复制代码 代码示例:

class A
{
  private string str1;
  private uint iCnt;

  public A(string str, uint i)
  {
      str1 = str;
      iCnt = i;
  }

  public A(string str)
  {
      str1 = str;
      iCnt = 100;
  }  
}

修改成如下的定义:
 

复制代码 代码示例:

class A
{
  private string str1;
  private uint iCnt;

  public A(string str, uint i)
  {
      str1 = str;
      iCnt = i;
  }

  public A(string str)
      : this(str, 100)
  {

  }
}

如果使用基类的构造函数,只要把this关键字换为base即可,但不能有多个调用。