类型与属性模式
根据形状和成员进行匹配。
类型与属性模式 是 CoddyKit 上的免费 C# Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C# Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C# Academy 课程共包含 4 节课。
类型模式
当输入是指定类型的实例时,类型模式会匹配。在切换分支中只写类型名称,就可以测试值的运行时类型。
这用简洁的单表达式检查取代了繁琐的 is 加类型转换链,同时还会自动为您缩小类型范围。
object o = "hello";
string kind = o switch
{
int => "number",
string => "text",
_ => "unknown"
};
System.Console.WriteLine(kind);声明模式
声明模式会在类型后添加变量名,例如 string s。匹配成功后,输入会被转换类型并绑定到该变量。
随后,您可以在分支的右侧使用这个类型明确的变量,访问该类型特有的成员,而无需进行额外的类型转换。
object o = "coddy";
string result = o switch
{
string s => $"len {s.Length}",
int n => $"value {n}",
_ => "other"
};
System.Console.WriteLine(result);可运行的类型切换
类型模式非常适合处理异构数据,例如解析来自 object 数组的值。
这里会根据每个元素的运行时类型进行匹配,并以相应的格式处理。绑定的变量会将缩小后的类型带入结果表达式。
using System;
class Program {
static string Describe(object o) => o switch {
int i => $"int {i}",
double d => $"double {d}",
string s => $"string '{s}'",
_ => "?"
};
static void Main() {
foreach (var x in new object[]{ 1, 2.5, "hi" })
Console.WriteLine(Describe(x));
}
}属性模式
属性模式使用大括号检查对象的成员:{ Property: value }。当列出的每个属性都满足其嵌套模式时,模式才会匹配。
这样可以直接根据对象的形状和内容进行分支,而无需手动编写成员比较。
record Person(string Name, int Age);
var p = new Person("Ada", 30);
string stage = p switch
{
{ Age: < 18 } => "minor",
{ Age: >= 65 } => "senior",
_ => "adult"
};
System.Console.WriteLine(stage);多个属性
您可以在大括号内用逗号分隔多个属性,从而同时测试它们。只有全部匹配时,分支才会执行。
这可以清晰地表达复合条件,例如匹配同时具有某种状态和特定计数的对象。
record Order(string Status, int Items);
var order = new Order("Open", 0);
string msg = order switch
{
{ Status: "Open", Items: 0 } => "empty cart",
{ Status: "Open" } => "shopping",
_ => "closed"
};
System.Console.WriteLine(msg);组合类型与属性
类型模式和属性模式可以组合使用:先写类型,再写一个包含属性的大括号块。只有当输入属于该类型且其属性也匹配时,分支才会匹配。
处理基类引用或接口时,这种方式非常强大,因为您可以同时根据具体子类型及其状态进行分支。
using System;
abstract record Shape;
record Circle(double R) : Shape;
record Square(double Side) : Shape;
class Program {
static string Big(Shape s) => s switch {
Circle { R: > 10 } => "big circle",
Square { Side: > 10 } => "big square",
_ => "small"
};
static void Main() => Console.WriteLine(Big(new Circle(12)));
}嵌套属性模式
属性模式可以嵌套。如果某个属性本身是一个对象,就可以使用另一个大括号块匹配其成员。
例如,{ Address: { City: "Paris" } } 可以在一个表达式中深入检查两层属性。这样可以避免使用容易引发 null 问题的点号访问链。
record Address(string City);
record User(string Name, Address Address);
var u = new User("Lin", new Address("Paris"));
bool inParis = u is { Address: { City: "Paris" } };
System.Console.WriteLine(inParis);扩展属性访问
从 C# 10 开始,您可以在属性模式中使用点号路径:{ Address.City: "Paris" }。这相当于使用嵌套的大括号。
这种写法可以将深层检查压缩成一行易读的代码,同时在匹配过程中安全地处理中间值。
record Address(string City);
record User(string Name, Address Address);
var u = new User("Lin", new Address("Rome"));
string where = u switch
{
{ Address.City: "Paris" } => "FR",
{ Address.City: "Rome" } => "IT",
_ => "??"
};
System.Console.WriteLine(where);捕获整个匹配结果
在属性模式后添加名称,可以将变量绑定到完整的匹配值:{ Age: > 18 } adult。
随后,变量 adult 会引用分支中的完整对象,这样在确认其属性通过测试后,您就可以使用该对象。
using System;
record Person(string Name, int Age);
class Program {
static void Main() {
Person p = new("Sam", 40);
string r = p switch {
{ Age: >= 18 } adult => $"{adult.Name} can vote",
_ => "too young"
};
Console.WriteLine(r);
}
}处理 null
属性模式永远不会匹配 null,因为没有对象可供检查。因此,{ }(空大括号)可以匹配任何非 null 值。
这使得 not null 和 { } 成为实用的 null 检查惯用写法,也能确保基于属性的分支安全地跳过 null 输入。
string? maybe = null;
string state = maybe switch
{
null => "missing",
{ Length: 0 } => "empty",
_ => "has text"
};
System.Console.WriteLine(state);模式为何优于类型转换
在引入模式之前,基于类型的分支通常意味着先进行 is 检查,再进行类型转换和 null 保护。类型模式和属性模式可以将这些操作合并到一个表达式中。
编译器还会跟踪完备性和可达性,能够发现手写 if 链会悄然忽略的无效分支和缺失情况。
object o = 42;
// Old: if (o is int) { int n = (int)o; ... }
// New:
if (o is int n) System.Console.WriteLine(n + 1);快速检查
测试您对类型模式和属性模式的理解。
回顾
类型模式根据运行时类型进行匹配,并且可以绑定一个类型明确的变量。属性模式使用 { Prop: pattern } 检查成员,支持嵌套和点号路径,并且永远不会匹配 null。
将它们组合起来,即可同时根据对象的形状和状态进行分支。下一步我们将介绍关系模式和逻辑模式。
常见问题解答
「类型与属性模式」课时是免费的吗?
是的 — 「类型与属性模式」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 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 反馈 — 无需本地设置。
此课程中的所有课时
- switch 表达式
- 类型与属性模式
- 关系模式与逻辑模式
- 列表与元组模式