在模式匹配中是vs Equals()vs ==

时间:2018-06-10 10:57:36

标签: c# pattern-matching

似乎在C#7中我们得到了一个新的模式匹配机制。
this article中所述,您可以使用is关键字检查变量是否具有特定值。

据我所知,is用于检查类型,而不是内容。
所以我想知道 - 在检查变量是否具有某个值时,在模式匹配中使用is而不是==Equals()有什么好处?

1 个答案:

答案 0 :(得分:1)

传统上,运算符用于测试实例是某种类型还是基类型。 (虽然因为简洁而 as 是首选)

class Shape {}
class Circle : Shape {}

var s = new Shape();
var c = new Circle();
Shape nullShape = null;

var isCaCircle = c is Circle; // -> true
var isSaCircle = s is Circle; // -> false
var isCaShape = c is Shape; // -> true
var isNullShapeNull = nullShape is null; // -> true;

了解这一点,在模式匹配表达式中使用它更直观,如:

if (c is Shape s) { 
     // use s of type Shape here 
}

我认为选择是因为更接近模式匹配需求并且表达意图比 == 更好,它可以执行引用检查或等式检查,但不是多态的类型兼容性检查。

另一方面,扩展 以执行相等比扩展 == 以执行多态类型兼容性(用于模式匹配目的)更为可行。< / p>