构造函数

什么是构造函数?

定义

在 C# 中,构造函数是一种特殊的方法,它与类同名,并且没有返回类型(甚至不能是 void)。构造函数主要用于在创建类的对象时初始化对象的状态。例如,当你创建一个Person类的对象时,可以使用构造函数来初始化Person对象的姓名、年龄等属性。

默认构造函数

如果一个类中没有定义任何构造函数,C# 编译器会自动提供一个默认构造函数。这个默认构造函数没有参数,并且它的作用是初始化对象的成员变量为它们的默认值(例如,数值类型为 0,引用类型为null)。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
class MyClass
{
int myVariable;
}
class Program
{
static void Main()
{
MyClass obj = new MyClass();
// 此时obj.myVariable的值为0
}
}

带参数的构造函数

可以定义带参数的构造函数来根据传入的参数初始化对象的属性。

例如,定义一个Rectangle类来表示矩形,有width和height两个属性:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Rectangle
{
public int Width { get; set; }
public int Height { get; set; }
public Rectangle(int width, int height)
{
Width = width;
Height = height;
}
}
class Program
{
static void Main()
{
Rectangle rect = new Rectangle(5, 3);
// 此时rect.Width的值为5,rect.Height的值为3
}
}

构造函数的重载

C# 允许在一个类中定义多个构造函数,只要它们的参数列表不同(参数个数、参数类型或者参数顺序不同)。这被称为构造函数的重载。

例如,对于上面的Rectangle类,可以添加一个默认构造函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Rectangle
{
public int Width { get; set; }
public int Height { get; set; }
public Rectangle()
{
Width = 0;
Height = 0;
}
public Rectangle(int width, int height)
{
Width = width;
Height = height;
}
}
class Program
{
static void Main()
{
Rectangle rect1 = new Rectangle();
// rect1.Width和rect1.Height的值都为0
Rectangle rect2 = new Rectangle(5, 3);
// rect2.Width的值为5,rect2.Height的值为3
}
}

构造函数的继承

在派生类中,如果没有显式地调用基类的构造函数,编译器会默认调用基类的无参数构造函数。

例如,有一个基类Shape和一个派生类Circle:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Shape
{
public string Name { get; set; }
public Shape()
{
Name = "Shape";
}
}
class Circle : Shape
{
public double Radius { get; set; }
public Circle(double radius)
{
Radius = radius;
}
}
class Program
{
static void Main()
{
Circle circle = new Circle(2.0);
// circle.Name的值为"Shape",这是因为默认调用了基类Shape的无参数构造函数
// circle.Radius的值为2.0
}
}

如果基类没有无参数构造函数,并且派生类需要调用基类的有参数构造函数,可以使用base关键字在派生类的构造函数中显式地调用基类构造函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Shape
{
public string Name { get; set; }
public Shape(string name)
{
Name = name;
}
}
class Circle : Shape
{
public double Radius { get; set; }
public Circle(double radius) : base("Circle")
{
Radius = radius;
}
}
class Program
{
static void Main()
{
Circle circle = new Circle(2.0);
// circle.Name的值为"Circle",通过base关键字调用了基类Shape的有参数构造函数
// circle.Radius的值为2.0
}
}


this 关键字

含义和用途

在 C# 中,this是一个引用当前类的实例的关键字。它主要用于在类的内部区分成员变量和局部变量,尤其是当它们名称相同时。例如,当一个类的方法参数与类的成员变量同名时,使用this可以明确地引用成员变量。

例如,有一个Person类,包含name属性和一个方法来设置name属性:

1
2
3
4
5
6
7
8
class Person
{
private string name;
public void SetName(string name)
{
this.name = name;
}
}

在SetName方法中,参数name是局部变量,this.name引用的是类中的成员变量name。当调用SetName方法并传入一个字符串时,这个字符串会被赋值给成员变量name。

在构造函数中的使用

this也常用于在一个类的构造函数中调用其他构造函数。这在构造函数重载的情况下很有用,可以避免代码重复。

例如,对于一个Rectangle类,有两个构造函数,一个接收长和宽,另一个只接收边长(用于创建正方形):

1
2
3
4
5
6
7
8
9
10
11
12
class Rectangle
{
private int width;
private int height;
public Rectangle(int width, int height)
{
this.width = width;
this.height = height;
}
public Rectangle(int sideLength) : this(sideLength, sideLength)
{
}

在第二个构造函数中,通过this(sideLength, sideLength)调用了第一个构造函数,这样就可以复用设置width和height的代码。

在链式调用中的应用

可以在方法返回当前类的实例时使用this来实现链式调用。例如,在一个Calculator类中:

1
2
3
4
5
6
7
8
9
10
11
12
13
class Calculator
{
private int result;
public Calculator Add(int num)
{
result += num;
return this;
}
public int GetResult()
{
return result;
}
}

可以这样使用:Calculator calc = new Calculator().Add(5).Add(3).GetResult();,这里Add方法返回this,使得可以连续调用Add方法。