更新:2007 年 11 月
实例构造函数用于创建和初始化实例。创建新对象时将调用类构造函数,例如:
C# | 复制代码 |
---|---|
class CoOrds { public int x, y; // constructor public CoOrds() { x = 0; y = 0; } } |
说明: |
---|
为了清楚起见,此类包含公共数据成员。建议不要使用这种编程方法,因为它使程序中任何位置的任何方法都可以不受限制、不经验证地访问对象的内部组件。数据成员通常应当为私有的,并且只应当通过类方法和属性来访问。 |
无论何时创建基于 CoOrds 类的对象,都会调用此构造函数。诸如此类不带参数的构造函数称为“默认构造函数”。然而,提供其他构造函数通常十分有用。例如,可以向 CoOrds 类添加构造函数,以便可以为数据成员指定初始值:
C# | 复制代码 |
---|---|
// A constructor with two arguments: public CoOrds(int x, int y) { this.x = x; this.y = y; } |
这样便可以用默认或特定的初始值创建 CoOrd 对象,如下所示:
C# | 复制代码 |
---|---|
CoOrds p1 = new CoOrds(); CoOrds p2 = new CoOrds(5, 3); |
如果类没有默认构造函数,将自动生成一个构造函数,并且将用默认值来初始化对象字段,例如,
也可以用实例构造函数来调用基类的实例构造函数。类构造函数可通过初始值设定项来调用基类的构造函数,如下所示:
C# | 复制代码 |
---|---|
class Circle : Shape { public Circle(double radius) : base(radius, 0) { } } |
在此示例中,Circle 类将表示半径和高度的值传递给 Shape(Circle 从它派生而来)提供的构造函数。使用 Shape 和 Circle 的完整示例请见本主题中的示例 3。
示例 1
下面的示例说明包含两个类构造函数的类:一个类构造函数没有参数,另一个类构造函数带有两个参数。
C# | 复制代码 |
---|---|
class CoOrds { public int x, y; // Default constructor: public CoOrds() { x = 0; y = 0; } // A constructor with two arguments: public CoOrds(int x, int y) { this.x = x; this.y = y; } // Override the ToString method: public override string ToString() { return (String.Format("({0},{1})", x, y)); } } class MainClass { static void Main() { CoOrds p1 = new CoOrds(); CoOrds p2 = new CoOrds(5, 3); // Display the results using the overriden ToString method: Console.WriteLine("CoOrds #1 at {0}", p1); Console.WriteLine("CoOrds #2 at {0}", p2); Console.ReadKey(); } } /* Output: CoOrds #1 at (0,0) CoOrds #2 at (5,3) */ |
示例 2
在此示例中,类 Person 没有任何构造函数;在这种情况下,将自动提供默认构造函数,同时将字段初始化为它们的默认值。
C# | 复制代码 |
---|---|
public class Person { public int age; public string name; } class TestPerson { static void Main() { Person person = new Person(); Console.WriteLine("Name: {0}, Age: {1}", person.name, person.age); // Keep the console window open in debug mode. Console.WriteLine("Press any key to exit."); Console.ReadKey(); } } // Output: Name: , Age: 0 |
注意,age 的默认值为 0,name 的默认值为 null。有关默认值的更多信息,请参见 默认值表(C# 参考)。
示例 3
下面的示例说明使用基类初始值设定项。Circle 类是从通用类 Shape 派生的,Cylinder 类是从 Circle 类派生的。每个派生类的构造函数都使用其基类的初始值设定项。
C# | 复制代码 |
---|---|
abstract class Shape { public const double pi = Math.PI; protected double x, y; public Shape(double x, double y) { this.x = x; this.y = y; } public abstract double Area(); } class Circle : Shape { public Circle(double radius) : base(radius, 0) { } public override double Area() { return pi * x * x; } } class Cylinder : Circle { public Cylinder(double radius, double height) : base(radius) { y = height; } public override double Area() { return (2 * base.Area()) + (2 * pi * x * y); } } class TestShapes { static void Main() { double radius = 2.5; double height = 3.0; Circle ring = new Circle(radius); Cylinder tube = new Cylinder(radius, height); Console.WriteLine("Area of the circle = {0:F2}", ring.Area()); Console.WriteLine("Area of the cylinder = {0:F2}", tube.Area()); // Keep the console window open in debug mode. Console.WriteLine("Press any key to exit."); Console.ReadKey(); } } /* Output: Area of the circle = 19.63 Area of the cylinder = 86.39 */ |
有关调用基类构造函数的更多示例,请参见 virtual(C# 参考)、override(C# 参考)和 base(C# 参考)。