c# - 用 is-operator 比较两个字符串
问题描述
我刚刚意识到您可以将两个字符串与is
所以像bool areEqual = "" is "";
返回true
或也
string x = null;
bool areEqual = x is null;
我不知道这是可能的,也没有在网上找到任何资源。is
使用运算符 over Equals
or有什么好处==
吗?
解决方案
您可以使用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);
然而,这只是另一个涉及大量编译器魔法的领域。
推荐阅读
- haskell - 函数参数似乎在类型分析中消失了
- c++ - 在 Xcode 11.4 中找不到标准 c++ 标头
- django - Django 2.2 如何将静态输入值发送到数据库
- workbox - 如何将更多文件添加到 precach 清单列表?
- firefox - 在 Shopify CORS 问题中嵌入 Vimeo 视频:从 Vimeo 获取嵌入代码时出错
- c# - ASP.NET Core 网页忽略 Startup.cs 中的 CORS 策略
- ruby-on-rails - 更改迁移时间戳以更改迁移在 Rails 中运行的顺序的最佳实践是什么?
- spring - 使用第三方身份验证保护资源服务器 RESTful API
- spring - 尝试创建测试时 Spring 配置和组件扫描中断
- c++ - 无法使用 GetAsyncKeyState 在 C/C++ 键盘记录器中捕获特殊键