# 实例构造函数（C# 编程指南）

class Coords
{
public Coords()
: this(0, 0)
{  }

public Coords(int x, int y)
{
X = x;
Y = y;
}

public int X { get; set; }
public int Y { get; set; }

public override string ToString() => $"({X},{Y})"; } class Example { static void Main() { var p1 = new Coords(); Console.WriteLine($"Coords #1 at {p1}");
// Output: Coords #1 at (0,0)

var p2 = new Coords(5, 3);
Console.WriteLine($"Coords #2 at {p2}"); // Output: Coords #2 at (5,3) } }  在上个示例中，第一个无参数构造函数调用两个参数都等于 0 的第二个构造函数。 要执行此操作，请使用 this 关键字。 在派生类中声明实例构造函数时，可以调用基类的构造函数。 为此，请使用 base 关键字，如以下示例所示： 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() => pi * x * x; } class Cylinder : Circle { public Cylinder(double radius, double height) : base(radius) { y = height; } public override double Area() => (2 * base.Area()) + (2 * pi * x * y); } class Example { static void Main() { double radius = 2.5; double height = 3.0; var ring = new Circle(radius); Console.WriteLine($"Area of the circle = {ring.Area():F2}");
// Output: Area of the circle = 19.63

var tube = new Cylinder(radius, height);
Console.WriteLine($"Area of the cylinder = {tube.Area():F2}"); // Output: Area of the cylinder = 86.39 } }  ## 无参数构造函数 如果某个类没有显式实例构造函数，C# 将提供可用于实例化该类实例的无参数构造函数，如以下示例所示： public class Person { public int age; public string name = "unknown"; } class Example { static void Main() { var person = new Person(); Console.WriteLine($"Name: {person.name}, Age: {person.age}");
// Output:  Name: unknown, Age: 0
}
}


structure 类型始终提供无参数构造函数： 无参数构造函数是可生成某种类型的默认值的隐式无参数构造函数或显式声明的无参数构造函数。 有关详细信息，请参阅结构类型一文的结构初始化和默认值部分。

## 主构造函数

public class NamedItem(string name)
{
public string Name => name;
}


// name isn't captured in Widget.
// width, height, and depth are captured as private fields
public class Widget(string name, int width, int height, int depth) : NamedItem(name)
{
public Widget() : this("N/A", 1,1,1) {} // unnamed unit cube

public int WidthInCM => width;
public int HeightInCM => height;
public int DepthInCM => depth;

public int Volume => width * height * depth;
}


[method: MyAttribute]
public class TaggedWidget(string name)
{
// details elided
}


classstruct 类型中，主构造函数参数在类型主体中的任意位置可用。 它们可用作成员字段。 使用主构造函数参数时，编译器使用编译器生成的名称捕获私有字段中的构造函数参数。 如果类型主体中未使用主构造函数参数，则不会捕获私有字段。 该规则可防止意外分配传递给基构造函数的主构造函数参数的两个副本。