你可以使用C# 7中新增的"is"模式来比较字符串和常量。这种模式最常见的用法是进行空值检查,而不需要调用等号运算符。
举个例子:
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
时不会调用。这对于检查
null
而不使用
ReferenceEquals
很方便(尽管编译器实际上特殊处理了
ReferenceEquals
)。 (有关更多信息,请参见下面的内容)。
然而,对于字符串而言,它的好处很少,因为编译器已经为您做了很多魔法重写。
如果您使用字符串而不是我上面示例中的类型,则在两种情况下都将执行直接比较的
ceq
指令,即使字符串重载了
==
运算符也是如此。
编辑:正如
@meJustAndrew在评论中指出的那样,这是因为将引用作为
object
类型进行比较,因此不涉及任何运算符。您可以从他的答案中看到,
test is null
的生成代码与
(object)test == null
的生成代码相同。
然而,这种转换仅适用于引用类型。
如果上面的代码是这样的:
var test = (int?)10;
Console.WriteLine(test == null);
Console.WriteLine(test is null);
两者都会编译成等效的代码:
Console.WriteLine(test.HasValue == false)
然而,这只是另一个需要大量编译器魔法的领域。最初的回答。
is
进行类型比较,判断变量x
是否为字符串类型,结果将赋值给布尔变量isString
。 - undefinedis
运算符用于检查类型的相等性。由于两个空字符串都具有相同的string
类型,该操作将返回true
。 - undefined"" is "x"
返回False
- 所以你的评论是错误的 @TetsuyaYamamoto - undefinedis
д»…з”ЁдәҺзұ»еһӢжЈҖжҹҘзҡ„иҜ„и®әзҡ„дәәйғҪйңҖиҰҒдәҶи§ЈдёҖдёӢC# 7дёӯзҡ„жЁЎејҸеҢ№й…ҚгҖӮ - undefinedx is null
需要使用 C# 7 及以上版本。如果你正在使用 C# 7 或更高版本,那么if (x is null)
是没有问题的。 - undefined