C# 为什么你更喜欢 is 关键字而不是 == 运算符？
没有更喜欢的，而且这两个运算符完全不同，没有可比性。

 **==** 十分受限，语义是"逻辑上相等"，且对值类型不是自动实现的，比如你写如下代码

            struct A{int a;int b;}    

因为没有定义(重载)，运算符==不能作用于A的实例之间。但是查看源码就会发现ValueType有默认的Equals实现，其中对满足unmanaged约束的struct来说就是简单的bitwise-comparison。

而is语义范围非常广，主要用在模式匹配中。

比如类型匹配：

            obj a...    if (a is null) // is not null    ...    if (a is B b)    ...    

比如值匹配：

            if (a is {field: ...})    ...    

比较重要的是，`a is null`不会调用==运算符。换言之，无论是==还是Equals都可能被重载(比如string)，`a isnull`是除了`Object.ReferenceEquals(a,null)`外唯一能够保证由CLR/.NET来检查null的方式，而前一种写法明显更加简洁。