You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于C#模式匹配中位置模式、var模式与丢弃模式的技术疑问

关于C#模式匹配中位置模式、var模式与丢弃模式的技术疑问

嘿,这个问题问到点子上了!我来给你逐个拆解这些模式匹配的细节,保证讲得明明白白~

第一个问题:为啥只有单个属性的Address record能使用("de")位置模式?

这其实是C# record类型的“隐藏福利”——编译器会自动为record生成解构方法,不管你定义的属性数量是1个还是多个。

比如你定义的public record Address(string Country);,编译器在后台会偷偷帮你生成这样的解构方法:

public void Deconstruct(out string Country)
{
    Country = this.Country;
}

而位置模式的核心就是依赖解构方法来提取值进行匹配。所以当你写("de")这个模式时,编译器会自动调用Address的解构方法,把Country属性的值取出来和"de"做比较,匹配成功就会进入这个分支。

第二个问题:(var country)的作用,以及为啥要加_,还有var模式和丢弃模式的组合逻辑

先看你代码里的几个分支:

  • UsAddress(var state):这是类型模式+位置模式的组合——先匹配UsAddress类型的实例,再通过解构把State属性的值捕获到state变量里。
  • ("de") _:这里的("de")是位置模式(匹配Country为"de"的Address实例),后面的_是丢弃模式。丢弃模式的作用是“匹配任何值,但不捕获它”。不过这里的_其实是冗余的——("de")本身就已经能匹配符合条件的整个Address实例,加_相当于多了一层“不管这个实例本身是什么,只要解构结果符合("de")就行”的判断,实际效果和只写("de")完全一样。
  • (var country) _:这里的(var country)是位置模式+var模式的组合——var模式的作用是把解构出来的Country属性的值捕获到country变量里,方便你在分支的返回值里使用这个变量。后面的_同样是丢弃模式,和上面的情况一样,属于冗余写法,只写(var country)就能匹配所有Address实例,同时捕获Country的值。

简单来说,var模式是“捕获值到变量”,丢弃模式是“匹配任何值但不捕获”。当它们组合时,比如(var country) _,逻辑是:先通过位置模式的var捕获Country的值,再用丢弃模式匹配整个实例(因为丢弃模式匹配任何实例,所以这个组合其实等价于只捕获值的位置模式)。

备注:内容来源于stack exchange,提问作者whoisit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 07:13:02