0Pricing
C# Academy · 课时

结构中的主构造函数

将主构造函数应用于值类型。

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

结构体中的主构造函数

结构体同样支持主构造函数:struct Point(int x, int y)。它们的工作方式与类中的主构造函数非常相似,都是在声明头中声明参数。

using System;

struct 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;

struct Vec(int x, int y) {
    public int X => x;
    public int Y => y;
}

var zero = new Vec(); // default: x=0, y=0
Console.WriteLine(zero.X + "," + zero.Y); // 0,0

通过属性公开参数

与类一样,结构体的主构造函数参数不会自动成为公共属性;请显式公开它们。

using System;

struct Size(int w, int h) {
    public int Width { get; } = w;
    public int Height { get; } = h;
}

var s = new Size(10, 20);
Console.WriteLine(s.Width * s.Height); // 200

计算成员

结构体主构造函数与计算成员和表达式主体成员搭配使用非常合适。

using System;

struct Complex(double re, double im) {
    public double Magnitude => Math.Sqrt(re * re + im * im);
}

Console.WriteLine(new Complex(3, 4).Magnitude); // 5

只读结构体

带有主构造函数的 readonly struct 可以保证不可变性。所有成员都不能改变状态,这与只读属性非常契合。

using System;

readonly struct Money(decimal amount, string currency) {
    public decimal Amount { get; } = amount;
    public string Currency { get; } = currency;
    public string Display => Amount.ToString("0.00") + " " + Currency;
}

Console.WriteLine(new Money(5m, "USD").Display); // 5.00 USD

链接到主构造函数

额外的结构体构造函数必须使用 : this(...) 调用主构造函数,这与类中的规则相同。

using System;

struct Square(int side) {
    public int Side => side;
    public int Area => side * side;
    public Square() : this(1) { } // explicit default side
}

Console.WriteLine(new Square(4).Area); // 16

默认构造函数与主构造函数

请注意,new Square() 可以使用隐式的零初始化,也可以使用您声明的无参数构造函数。如果您定义了一个会进行链接的构造函数,就会执行其中的逻辑。

using System;

struct Pct(double value) {
    public double Value { get; } = value;
    public Pct() : this(100) { }
}

Console.WriteLine(new Pct().Value); // 100

值语义保持不变

结构体仍然按值复制。主构造函数不会改变这一点:赋值结构体时会复制它的所有字段。

using System;

struct Counter(int n) {
    public int N { get; set; } = n;
}

var a = new Counter(1);
var b = a;       // copy
b.N = 99;
Console.WriteLine(a.N + " " + b.N); // 1 99

初始化可变字段

您可以根据参数初始化可设置的属性或字段,不过通常更推荐使用不可变结构体。

using System;

struct Bag(int capacity) {
    public int Capacity { get; set; } = capacity;
    public int Used { get; set; } = 0;
}

var bag = new Bag(10);
bag.Used = 3;
Console.WriteLine(bag.Capacity - bag.Used); // 7

解构

将主构造函数与 Deconstruct 方法结合,即可获得类似元组的拆包功能。

using System;

struct Point(int x, int y) {
    public int X => x;
    public int Y => y;
    public void Deconstruct(out int a, out int b) { a = x; b = y; }
}

var (px, py) = new Point(7, 8);
Console.WriteLine(px + "," + py); // 7,8

综合运用

使用只读结构体和主构造函数构建一个小型不可变值类型。

using System;

readonly struct Temperature(double celsius) {
    public double Celsius { get; } = celsius;
    public double Fahrenheit => Celsius * 9 / 5 + 32;
}

var t = new Temperature(25);
Console.WriteLine(t.Fahrenheit); // 77

快速检查

请检验您对结构体主构造函数的掌握程度。

回顾

您已经了解了结构体中的主构造函数。

  • struct P(int x, int y) 会在声明头中声明参数。
  • 隐式的无参数构造函数仍然存在。
  • 结合 readonly struct 可以创建不可变值类型。
  • 额外的构造函数会通过 : this(...) 链接。

常见问题解答

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

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

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

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

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

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

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

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

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

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

此课程中的所有课时

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