构造函数
任何时候,只要创建类或结构,就会调用它的构造函数。类或结构可能有多个接受不同参数的构造函数。构造函数使得程序员可设置默认值、限制实例化以及编写灵活便于阅读的代码。
如果没有为对象提供构造函数,默认情况下C#将创建一个构造函数,该构造函数实例化对象,并将所有成员变量设置为此处列出的默认值。静态类和结构也可以有构造函数。
使用构造函数
构造函数具有与类相同的名称,它通常初始化新对象的数据成员。
不带参数的构造函数称为“默认构造函数”。无论何时,只要使用new运算符实例化对象,并且不为new提供任何参数,就会调用默认构造函数。
除非类是static的,否则C#编译器将为无构造函数的类提供一个公共的默认构造函数,以便该类可以实例化。
类和structs都可以定义具有参数的构造函数。带参数的构造函数必须通过new语句或base语句来调用。类和structs还可以定义多个构造函数,并且二者均不需要定义默认构造函数。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
{
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(500, 52);
//构造函数可以使用base关键字来调用基类的构造函数:
public class Manager : Employee
{
public Manager(int annualSalary)
: base(annualSalary)
{
//Add further instructions here.
}
}
这里,基类的构造函数在执行构造函数块之前被调用。base 关键字可带参数使用,也可不带参数使用。构造函数的任何参数都可用作 base 的参数,或用作表达式的一部分。
在派生类中,如果不使用 base 关键字来显式调用基类构造函数,则将隐式调用默认构造函数(如果有的话)。这意味着下面的构造函数声明在效果上是相同的:
{
//Add further instructions here.
}
public Manager(int initialdata) : base()
{
//Add further instructions here.
}
如果基类没有提供默认构造函数,派生类必须使用base显式调用基构造函数。
构造函数可以使用this关键字调用同一对象中的另一构造函数。和base一样,this可带参数使用也可不带参数使用,构造函数中的任何参数都可用作this的参数,或者用作表达式的一部分,如:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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修饰符来清楚地表明该类不能被实例化。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
{
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);
}
}
静态构造函数:
静态构造函数用于初始化任何静态数据,或用于执行仅需执行一次的特定操作。在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数。
静态构造函数既没有访问修饰符,也没有参数。
无法直接调用静态构造函数。在程序中,用户无法控制何时执行静态构造函数。
为结构声明默认的构造函数是错误的,因为每一个值类型都隐式具有一个公共的默认构造函数。可以在结构类型上声明参数化构造函数以设置其初始值,但是,只有在需要默认值之外的值时才必须这样做。