问题描述
我正在教我的学生如何编写函数。我使用一种简单的算法来确定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
- 至少according to one of the developers on the C# team at Microsoft。但是他会知道什么?他只是建造东西。
- 真的,如果您算上exception filters,请使用C#6。
- Jared Parsons again。
- 我会拒绝该论据,理由是消除否定的任何收益都小于我们验证null的方式所引入的微妙之处。但是您可以尝试使用该参数;)在有人问之前,我现在不知道这两个选项的执行情况。