0Pricing
C# Academy · 课时

类中的主构造函数

在类型声明头中声明构造函数参数。

类中的主构造函数 是 CoddyKit 上的免费 C# Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C# Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C# Academy 课程共包含 4 节课。

什么是主构造函数

主构造函数允许您直接在类头部声明构造函数参数,例如 class Point(int x, int y)。这些参数在整个类体中都处于作用域内。

using System;

class Point(int x, int y) {
    public int X => x;
    public int Y => y;
}

var p = new Point(3, 4);
Console.WriteLine(p.X + "," + p.Y); // 3,4

不再需要样板代码

在使用主构造函数之前,您需要编写构造函数体,只为了将参数复制到字段中。现在,类头部会声明这些参数,您可以直接引用它们。

using System;

class Greeter(string name) {
    public string Greet() => "Hello, " + name + "!";
}

Console.WriteLine(new Greeter("Ada").Greet()); // Hello, Ada!

参数在任何位置都处于作用域内

主构造函数参数可以在类中任何位置的属性初始化器、方法体和字段初始化器中使用。

using System;

class Circle(double radius) {
    public double Area => Math.PI * radius * radius;
    public double Circumference => 2 * Math.PI * radius;
}

var c = new Circle(2);
Console.WriteLine(Math.Round(c.Area, 2)); // 12.57

初始化字段和属性

您可以在字段或属性声明时使用主构造函数参数进行初始化。

using System;

class Account(decimal initial) {
    public decimal Balance { get; private set; } = initial;
    public void Deposit(decimal amount) => Balance += amount;
}

var a = new Account(100m);
a.Deposit(50m);
Console.WriteLine(a.Balance); // 150

在类头部进行验证

为字段赋值时,您可以使用抛出表达式在线验证主构造函数参数。

using System;

class Person(string name) {
    public string Name { get; } =
        string.IsNullOrWhiteSpace(name)
            ? throw new ArgumentException("name required")
            : name;
}

Console.WriteLine(new Person("Lin").Name); // Lin

添加额外构造函数

带有主构造函数的类仍然可以声明其他构造函数,但这些构造函数必须通过 : this(...) 链接到主构造函数。

using System;

class Box(int width, int height) {
    public int Width => width;
    public int Height => height;
    public Box(int size) : this(size, size) { }
}

var sq = new Box(5);
Console.WriteLine(sq.Width + "x" + sq.Height); // 5x5

主构造函数体

主构造函数没有自己的构造函数体。必须在构造时运行的逻辑应放入字段初始化器或通过链接的常规构造函数中。

using System;

class Logger(string prefix) {
    private readonly string tag = "[" + prefix + "]";
    public void Log(string msg) => Console.WriteLine(tag + " " + msg);
}

new Logger("INFO").Log("started"); // [INFO] started

不会自动创建公共属性

与记录不同,普通类中的主构造函数不会创建公共属性。除非您自行公开,否则这些参数仅供类内部使用。

using System;

class Temp(double celsius) {
    // celsius is NOT a public property here
    public double Fahrenheit => celsius * 9 / 5 + 32;
}

Console.WriteLine(new Temp(100).Fahrenheit); // 212

被捕获的参数会成为字段

当主构造函数参数在方法中使用时(而不仅仅是在初始化器中使用),编译器会将其捕获到隐藏字段中,使其在构造完成后仍然存在。

using System;

class Counter(int start) {
    private int value = start;
    public int Next() => value++;
}

var c = new Counter(10);
Console.WriteLine(c.Next()); // 10
Console.WriteLine(c.Next()); // 11

更简洁的依赖注入

主构造函数很适合 DI:您可以在类头部声明服务,并在方法中使用它们,而无需手动为字段赋值。

using System;

interface IClock { string Now(); }
class FakeClock : IClock { public string Now() => "12:00"; }

class Service(IClock clock) {
    public string Report() => "Time is " + clock.Now();
}

Console.WriteLine(new Service(new FakeClock()).Report()); // Time is 12:00

综合运用

此类使用主构造函数声明其依赖项,并公开一个计算属性,而无需显式的构造函数体。

using System;

class Rectangle(double w, double h) {
    public double Area => w * h;
    public double Perimeter => 2 * (w + h);
}

var r = new Rectangle(3, 4);
Console.WriteLine(r.Area + " " + r.Perimeter); // 12 14

快速检查

检查您对类中主构造函数的理解。

回顾

您学习了类中的主构造函数。

  • class C(int x) 会在类头部声明构造函数参数。
  • 参数在整个类体中都处于作用域内。
  • 额外构造函数通过 : this(...) 链接。
  • 在普通类中,这些参数不会自动成为公共属性。

常见问题解答

「类中的主构造函数」课时是免费的吗?

是的 — 「类中的主构造函数」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C# Academy 课程的其余内容,请升级到 CoddyKit PRO。 C# Academy 课程共包含 4 节课。

「类中的主构造函数」这节课中我会学到什么?

在类型声明头中声明构造函数参数。 你通过在浏览器中直接运行的动手代码来练习 C# Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 C# Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 C# Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「类中的主构造函数」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 C# Academy 课中编写并运行代码吗?

能。每节 C# Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 类中的主构造函数
  2. 在成员中捕获参数
  3. 结构中的主构造函数
  4. 与属性和基类结合
← 返回 C# Academy