模式匹配(pattern matching)是 C# 中的一种强大功能,允许你在检查对象类型的同时提取属性。`if (a is B { bb: a })` 的意思是检查对象 `a` 是否是类型 `B`,并且如果是,将其属性 `bb` 的值赋给变量 `a`。
以下是一个完整的控制台应用程序示例,演示如何使用这种模式匹配:
```csharp
using System;
namespace PatternMatchingDemo
{
class Program
{
static void Main(string[] args)
{
object obj1 = new A { aa = 10 };
object obj2 = new B { bb = 20 };
CheckObject(obj1);
CheckObject(obj2);
}
static void CheckObject(object obj)
{
if (obj is A { aa: var aaValue })
{
Console.WriteLine($"Object is of type A with aa = {aaValue}");
}
else if (obj is B { bb: var bbValue })
{
Console.WriteLine($"Object is of type B with bb = {bbValue}");
}
else
{
Console.WriteLine("Object is of an unknown type");
}
}
}
class A
{
public int aa { get; set; }
}
class B
{
public int bb { get; set; }
}
}
```
### 解释
1. **`A` 类和 `B` 类**:
- `A` 类包含一个 `aa` 属性。
- `B` 类包含一个 `bb` 属性。
2. **`Main` 方法**:
- 创建两个对象 `obj1` 和 `obj2`,分别为类型 `A` 和 `B` 的实例。
- 调用 `CheckObject` 方法来检查每个对象的类型。
3. **`CheckObject` 方法**:
- 使用模式匹配检查 `obj` 是否是类型 `A`,如果是,则提取其 `aa` 属性值并赋给变量 `aaValue`。
- 使用模式匹配检查 `obj` 是否是类型 `B`,如果是,则提取其 `bb` 属性值并赋给变量 `bbValue`。
- 如果对象不属于类型 `A` 或 `B`,输出未知类型的消息。
### 示例运行结果
```
Object is of type A with aa = 10
Object is of type B with bb = 20
```
### 关键点总结
- **`if (obj is A { aa: var aaValue })`**:
- 检查 `obj` 是否是类型 `A`。
- 如果是,将 `A` 的 `aa` 属性的值赋给变量 `aaValue`。
- **`if (obj is B { bb: var bbValue })`**:
- 检查 `obj` 是否是类型 `B`。
- 如果是,将 `B` 的 `bb` 属性的值赋给变量 `bbValue`。
通过这种方式,你可以在一个条件语句中同时进行类型检查和属性提取,使代码更加简洁和易读。