C#中是否还有另一个“是”运算符?

问题描述

我正在教我的学生如何编写函数。我使用一种简单的算法来确定char值是否为实际字母(而不是数字或其他字符)。

所以我实际上输入了我的学生说的话(故意打哑巴):“如果(字母为'A'){...}” 令我惊讶的是,这没有引起编译器错误。我为“ B”和“ C”添加了相同的检查,现在我的程序可以确定A,B和C确实是字母。

为什么行得通?我到底在这里比较什么? 我没有积极使用类型比较,这是Internet不断发展的趋势。

我使用其他值进行了另外的实验:

 char l = 'A';
 if (l is 'A')
 {
    Console.WriteLine("l 'A'...");
 }
 if (l is "A")
 {
    // Doesn't compile.
 }

 int x = 15;
 if (x is 15)
 {
    Console.WriteLine("X is 15.");
 }
 if (x is 5.6)
 {
    // Also doesn't compile.
 }

据我所知,“ is”函数是等号(==)运算符的扩展版本,该运算符也强制执行相同的类型。但是我找不到任何文档。

解决方法

is可能有两种含义,具体取决于您使用的C#版本。

在较早的C#版本中,is的缩写是“可分配给”或“可从……分配”,具体取决于您脑海中的代码读取方式。它不适用于您班级中的代码,因为它需要在右侧使用 type ,但是为了完整起见,在此添加了它。作为有效且可移植的空检查,它也很有用,即variable is object是编写variable != null 1 的更好方法。

在较新的C#版本中,is也可以用于 pattern matching 。这是在C#7 2 extended in C# 8中引入的,更多内容在9中引入。具体地说,问题中的代码创建了Constant Pattern expression

这是观看此作品的另一种有趣方式。进入C#9,而不是像这样编写检查:

if (!string.IsNullOrEmpty(mystring))

您可以改写 3

if (mystring is {Length:>0})

这很不错,因为它更短,并且您可以提出消除否定的参数,以使其更易于理解。 4


  1. 至少according to one of the developers on the C# team at Microsoft。但是他会知道什么?他只是建造东西。
  2. 真的,如果您算上exception filters,请使用C#6。
  3. Jared Parsons again
  4. 我会拒绝该论据,理由是消除否定的任何收益都小于我们验证null的方式所引入的微妙之处。但是您可以尝试使用该参数;)在有人问之前,我现在不知道这两个选项的执行情况。