[英]Compare two strings with the is-operator
我才意识到,你可以比较两个字符串is
所以像bool areEqual = "" is "";
返回true
或
string x = null;
bool areEqual = x is null;
我不知道这是可能的,并且在网络上找不到任何资源。 使用is
运算符比Equals
或==
有什么好处吗?
您可以使用is
pattern比较字符串和常量 ,这是C#7中的新增功能。
此模式最常见的用法是执行空检查,而不调用相等运算符。
举个例子:
using System;
public class Program
{
public static void Main()
{
var test = new Test();
Console.WriteLine(test == null);
Console.WriteLine(test is null);
}
public class Test
{
public static bool operator ==(Test a, Test b)
{
Console.WriteLine("==");
return ReferenceEquals(a, b);
}
public static bool operator !=(Test a, Test b)
{
Console.WriteLine("!=");
return !ReferenceEquals(a, b);
}
}
}
这将输出:
==
False
False
意思是, ==
运算符(将Test
和常量进行比较)将仅被调用一次。 当使用is
,它将不会。 这在不使用ReferenceEquals
情况下检查null
是否很方便(尽管ReferenceEquals
实际上是由编译器特殊处理的)。 (更多信息请参见下文)。
但是,对于字符串来说,它没有什么好处,因为编译器已经为您完成了许多魔术重写。
如果您使用字符串而不是上面示例中的类型,则在两种情况下都将执行直接比较的ceq
指令,即使string重载了==
运算符。
编辑:正如@meJustAndrew在评论中指出的,这是因为比较是在引用上完成的,就像它是object
类型一样,因此不涉及运算符。 您可以从他在底部附近的答案中看到实际发生的情况。 生成的test is null
代码test is null
,与(object)test == null
代码相同。
但是,此特定转换仅适用于引用类型。
如果上面Main
的代码是
var test = (int?)10;
Console.WriteLine(test == null);
Console.WriteLine(test is null);
两者都将编译为以下等效代码:
Console.WriteLine(test.HasValue == false);
但是,这只是涉及很多编译器魔术的另一个领域。
is
通常用于许多在评论中已经指出的类型检查。
例如:
object obj = 23;
bool isInt = obj is int; //this will be true
当然,您可以使用它来比较字符串或与null进行比较,但是(这会稍微影响基于主要观点的答案)我建议您这样做,因为它与大多数项目中您会看到字符串比较的不一致或空检查。
例如,空检查将是if(a != null)
或if(a is null)
,这将促使人们以两种不同方式使用比较。
编辑:
我只是写了一小段代码,以了解幕后发生的事情,看来使用is
运算符和经典的null检查之间没有什么区别。 对于以下代码:
object obj = 23;
bool withIs = obj is null;
bool withEquals = obj == null;
IL的反汇编版本如下所示:
object obj = 23;
bool withIs = obj == null;
bool withEquals = obj == null;
因此,事实证明最终生成的IL是相同的,这再次使我建议您仅将is
运算符用于类型检查。
对于其他答案中使用的代码,这是IL中Main
函数的外观:
Test test = new Test();
Console.WriteLine(test == null);
Console.WriteLine((object)test == null);
您可以看到在最后一行, test
变量将object
强制转换为object
,这就是为什么在进行is null
比较时,似乎未调用==
运算符的原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.