构造函数

任何时候,只要创建类或结构,就会调用它的构造函数。类或结构可能有多个接受不同参数的构造函数。构造函数使得程序员可设置默认值、限制实例化以及编写灵活便于阅读的代码。

如果没有为对象提供构造函数,默认情况下C#将创建一个构造函数,该构造函数实例化对象,并将所有成员变量设置为此处列出的默认值。静态类和结构也可以有构造函数。

使用构造函数

构造函数具有与类相同的名称,它通常初始化新对象的数据成员。

不带参数的构造函数称为“默认构造函数”。无论何时,只要使用new运算符实例化对象,并且不为new提供任何参数,就会调用默认构造函数。

除非类是static的,否则C#编译器将为无构造函数的类提供一个公共的默认构造函数,以便该类可以实例化。

类和structs都可以定义具有参数的构造函数。带参数的构造函数必须通过new语句或base语句来调用。类和structs还可以定义多个构造函数,并且二者均不需要定义默认构造函数。

public class Employee
{
    
public int salary;

    
public Employee(int annualSalary)
    {
        salary 
= annualSalary;
    }

    
public Employee(int weeklySalary, int numberOfWeeks)
    {
        salary 
= weeklySalary * numberOfWeeks;
    }
}

//此类可以使用下列语句中的任一个来创建:
Employee e1 = new Employee(30000);
Employee e2 
= new Employee(50052);

//构造函数可以使用base关键字来调用基类的构造函数:
public class Manager : Employee
{
    
public Manager(int annualSalary)
        : 
base(annualSalary)
    {
        
//Add further instructions here.
    }
}

这里,基类的构造函数在执行构造函数块之前被调用。base 关键字可带参数使用,也可不带参数使用。构造函数的任何参数都可用作 base 的参数,或用作表达式的一部分。
在派生类中,如果不使用 base 关键字来显式调用基类构造函数,则将隐式调用默认构造函数(如果有的话)。这意味着下面的构造函数声明在效果上是相同的:

public Manager(int initialdata)
{
    
//Add further instructions here.
}

public Manager(int initialdata) : base()
{
    
//Add further instructions here.
}

如果基类没有提供默认构造函数,派生类必须使用base显式调用基构造函数。

构造函数可以使用this关键字调用同一对象中的另一构造函数。和base一样,this可带参数使用也可不带参数使用,构造函数中的任何参数都可用作this的参数,或者用作表达式的一部分,如:

//上面的构造函数:
public Employee(int weeklySalary, int numberOfWeeks)
    {
        salary 
= weeklySalary * numberOfWeeks;
    }
//可以被改写成:
public Employee(int weeklySalary, int numberOfWeeks)
    : 
this(weeklySalary * numberOfWeeks)
{
}
//this关键字导致此构造函数被调用:
public Employee(int annualSalary)
{
    salary 
= annualSalary;
}

实例构造函数:

实例构造函数用于创建和初始化实例。创建新对象时将调用类构造函数。

私有构造函数:

私有构造函数是一种特殊的实例构造函数。它通常用在只包含静态成员的类中。如果类具有一个或多个私有构造函数而没有公共构造函数,则不允许其他类(除了嵌套类)创建该类的实例。

如果不对构造函数使用访问修饰符,则在默认情况下它仍为私有构造函数。但是,通常显式地使用private修饰符来清楚地表明该类不能被实例化。

private
public class Counter
{
    
private Counter() { }
    
public static int currentCount;
    
public static int IncrementCount()
    {
        
return ++currentCount;
    }
}

class TestCounter
{
    
static void Main()
    {
        
// Counter aCounter = new Counter();   // Error
        Counter.currentCount = 100;
        Counter.IncrementCount();
        System.Console.WriteLine(
"New count: {0}", Counter.currentCount);
    }
}
//输出:New count: 101

静态构造函数:

静态构造函数用于初始化任何静态数据,或用于执行仅需执行一次的特定操作。在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数。

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

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

为结构声明默认的构造函数是错误的,因为每一个值类型都隐式具有一个公共的默认构造函数。可以在结构类型上声明参数化构造函数以设置其初始值,但是,只有在需要默认值之外的值时才必须这样做。

原文地址:https://www.cnblogs.com/niuniu1985/p/1732638.html