0Pricing
C# Academy · 课时

在成员中捕获参数

在整个类型中使用主构造函数参数。

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

在成员中使用参数

主构造函数的强大之处在于可以在成员中使用参数:方法、属性和字段初始化器都可以使用。编译器会根据需要安排存储。

using System;

class Multiplier(int factor) {
    public int Apply(int n) => n * factor;
}

Console.WriteLine(new Multiplier(3).Apply(5)); // 15

捕获与仅用于初始化

如果参数只在字段或属性初始化器中使用,则不需要额外存储。如果参数在方法中使用,编译器会将其捕获到隐藏字段中。

using System;

class A(int x) {
    public int Stored = x;     // initializer only
}
class B(int x) {
    public int Get() => x;     // captured into a field
}

Console.WriteLine(new A(7).Stored); // 7
Console.WriteLine(new B(9).Get());  // 9

参数可以修改

主构造函数参数的行为与普通参数相同:在实例内部可以修改,除非您将其视为只读。修改参数会改变被捕获的字段。

using System;

class Toggle(bool on) {
    public void Flip() => on = !on;
    public bool State => on;
}

var t = new Toggle(false);
t.Flip();
Console.WriteLine(t.State); // True

公开只读属性

一种常见模式是通过只读属性公开参数,从而提供简洁的公共接口,同时将参数保留在内部。

using System;

class User(string email) {
    public string Email { get; } = email;
}

Console.WriteLine(new User("a@b.com").Email); // a@b.com

根据参数计算属性

参数可以自然地用于表达式体计算属性。

using System;

class Money(decimal amount, string currency) {
    public string Display => amount.ToString("0.00") + " " + currency;
}

Console.WriteLine(new Money(9.5m, "USD").Display); // 9.50 USD

在多个方法中使用参数

同一个被捕获的参数可以由多个方法共享,其作用类似于在构造时初始化的私有字段。

using System;

class Range2(int lo, int hi) {
    public bool Contains(int n) => n >= lo && n <= hi;
    public int Clamp(int n) => Math.Max(lo, Math.Min(hi, n));
}

var r = new Range2(0, 10);
Console.WriteLine(r.Contains(5)); // True
Console.WriteLine(r.Clamp(15));   // 10

捕获引用类型

捕获的引用类型参数让您能够存储注入的依赖项,并在任意方法中调用它们。

using System;
using System.Collections.Generic;

class Repo(List<string> store) {
    public void Add(string item) => store.Add(item);
    public int Count => store.Count;
}

var list = new List<string>();
var repo = new Repo(list);
repo.Add("x");
Console.WriteLine(repo.Count); // 1

避免意外重复存储

如果您既将参数赋给字段,又在方法中使用该参数,最终可能会将该值存储两次。为保持清晰,请优先选择其中一种方式。

using System;

class Clean(int x) {
    // expose once via property, reference property in methods
    public int Value { get; } = x;
    public int Doubled() => Value * 2;
}

Console.WriteLine(new Clean(4).Doubled()); // 8

匿名函数中的参数

类中定义的匿名函数可以捕获参数,就像捕获字段一样。

using System;
using System.Collections.Generic;
using System.Linq;

class Filter(int threshold) {
    public IEnumerable<int> KeepAbove(IEnumerable<int> xs) =>
        xs.Where(n => n > threshold);
}

var f = new Filter(3);
Console.WriteLine(string.Join(",", f.KeepAbove(new[]{1,2,3,4,5}))); // 4,5

作用域生命周期

捕获的参数会与对象共存。它实际上属于实例状态,因此请不要假设它会在方法调用之间重置。

using System;

class Accumulator(int seed) {
    private int total = seed;
    public int Add(int n) { total += n; return total; }
}

var a = new Accumulator(100);
Console.WriteLine(a.Add(1)); // 101
Console.WriteLine(a.Add(1)); // 102

综合运用

此服务捕获两个依赖项,并在多个方法中使用它们,展示了实际应用中常见的结构。

using System;

class PriceService(decimal taxRate, string currency) {
    public decimal WithTax(decimal net) => net * (1 + taxRate);
    public string Format(decimal v) => v.ToString("0.00") + " " + currency;
}

var s = new PriceService(0.2m, "EUR");
Console.WriteLine(s.Format(s.WithTax(100m))); // 120.00 EUR

快速检查

请确认主构造函数参数的存储方式。

回顾

您已经了解了如何在成员中使用主构造函数参数。

  • 在方法中使用时,参数会被捕获到隐藏字段中。
  • 仅在初始化器中使用时,则不需要额外存储。
  • 通过只读属性公开它们,可以获得简洁的接口。
  • 在对象的生命周期内,它们的行为与实例状态相同。

常见问题解答

「在成员中捕获参数」课时是免费的吗?

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

「在成员中捕获参数」这节课中我会学到什么?

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

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

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

「在成员中捕获参数」课时需要多长时间?

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

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

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

此课程中的所有课时

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