首页 > 解决方案 > 用 is-operator 比较两个字符串

问题描述

我刚刚意识到您可以将两个字符串与is

所以像bool areEqual = "" is "";返回true或也

string x = null;
bool areEqual = x is null;

我不知道这是可能的,也没有在网上找到任何资源。is使用运算符 over Equalsor有什么好处==吗?

标签: c#stringstring-comparison

解决方案


您可以使用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

意思是==,比较 aTest和常量的操作符只会被调用一次。使用时is,不会。null这对于在不使用的情况下进行检查很方便ReferenceEquals(尽管ReferenceEquals实际上由编译器进行了特殊处理)。(有关更多信息,请参见下文)。

然而,对于字符串,它几乎没有什么好处,因为编译器已经为你做了很多神奇的重写。

如果您使用字符串而不是我上面示例中的类型,ceq则在这两种情况下都会执行直接比较的指令,即使字符串已经重载了==运算符。

编辑:正如@meJustAndrew在评论中指出的那样,这是因为比较是在引用上完成的,就好像它是 type 一样object,因此不涉及运算符。您可以从他在底部附近的回答中看到实际发生的情况。生成的代码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);

然而,这只是另一个涉及大量编译器魔法的领域。


推荐阅读