繁体   English   中英

比较两个字符串与is-operator

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM