构造函数
什么是构造函数?
定义
在 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(); } }
|
带参数的构造函数
可以定义带参数的构造函数来根据传入的参数初始化对象的属性。
例如,定义一个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); } }
|
构造函数的重载
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(); Rectangle rect2 = new Rectangle(5, 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); } }
|
如果基类没有无参数构造函数,并且派生类需要调用基类的有参数构造函数,可以使用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); } }
|
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方法。