this关键字在构造函数中的应用
当类中有多个构造函数且它们之间存在相同的代码,为了减少冗余的代码,可以使用this进行串联构造函数流的方式进行声明构造函数,例如:
class Motorcycle
{
public int driverIntensity;
public string driverName;
public Motorcycle()
{
Console.WriteLine("In default ctor");
}
public Motorcycle(int intensity)
: this(intensity, "")
{
Console.WriteLine("In ctor taking an int");
}
//主构造函数
public Motorcycle(int intensity, string name)
{
Console.WriteLine("In master ctor ");
if (intensity > 10)
{
intensity = 10;
}
driverIntensity = intensity;
driverName = name;
}
}
static void Main(string[] args)
{
Motorcycle c = new Motorcycle(5);
c.SetDriverName("Tiny");
Console.WriteLine("Rider name is {0}", c.driverName);
Console.WriteLine();
}
一般以参数最多的构造函数为主构造函数
构造函数逻辑流程:
1 通过调用只有单个参数的构造函数
2 将传入的参数通过this串联构造函数流将参数传入主构造函数,并且补上余下的参数
3 执行主构造函数
4 返回原构造函数
可选参数构造函数
在.NET4中提供了可选参数的构造函数,即
定义可选参数的构造函数
public Motorcycle(int intensity = 0, string name = "")
{
if (intensity > 10)
{
intensity = 10;
}
driverIntensity = intensity;
driverName = name;
}
调用构造函数
Motorcycle m1 = new Motorcycle();
Console.WriteLine("Name= {0}, Intensity= {1}", m1.driverName, m1.driverIntensity);
// driverName = "Tiny", driverIntensity = 0
Motorcycle m2 = new Motorcycle(name:"Tiny");
Console.WriteLine("Name= {0}, Intensity= {1}", m2.driverName, m2.driverIntensity);
// driverName = "", driverIntensity = 7
Motorcycle m3 = new Motorcycle(7);
Console.WriteLine("Name= {0}, Intensity= {1}", m3.driverName, m3.driverIntensity);
但由于这种用法只能在.NET4及以上版本才可以,所以,一般很少用,主要用this进行串联构造函数流的方式进行声明构造函数
静态构造函数
静态构造函数是特殊的构造函数,适合用于初始化在编译时未指定静态数据的值,例如从外部数据导入或者运行时随机生成等
静态构造函数注意事项;
1 一个类只能有一个静态构造函数,也就是说静态构造函数不能被重载
2 静态构造函数不可以用访问修饰符修饰(默认public),并且必须是无参构造函数
3 不论创建多少实例,静态构造函数只执行一次
4 在访问静态成员或创建实例之前,必须运行静态构造函数
5 静态构造函数的优先级别高于任何级别的构造函数