C# 为什么你应该更喜欢 is 关键字而不是 == 运算符
前言
在C# 进行开发中,检查参数值是否为null大家都用什么?本文介绍除了传统的方式==运算符,还有一种可以商用is关键字。
C# 7.0 中 is 关键字的使用
传统的方式是使用==运算符:
if(person == null) { }
从 C# 7 开始,可以使用is关键字进行空检查:
if(person is null) { }
1、is关键字有一个很大的优势,它会忽略在要检查的实例的类上定义的任何运算符重载。
2、当使用==运算符时,该运算符可能会被重载,并且会得到意想不到的结果。
示例
1、is关键字
我们来看一个简单的例子,创建一个.NET 控制台应用程序,在Main 方法中编写如下所示代码。
首先声明了一个person类型的变量Person,并且赋值null, 然后将person == null和结果person is null写入控制台。
static void Main(string[] args)
{
Person person = null;
Console.WriteLine("Is Person null?");
Console.WriteLine($"== says: {person == null}");
Console.WriteLine($"is says: {person is null}");
}
public class Person
{
...
}
可以猜猜,上面代码的运行结果会是什么?
大家可能认为控制台会输出下面结果:
Is Person null?
== says: True
is says: True
实际上,可以从上面的代码中肯定地说, person is null肯定会返回true,因为person变量实际上是null。
但是 person == null 返回 true或false,是不确定的,因为 Person类没有定义任何的内容。如果Person类重载了==操作符,它就可以为所欲为。
2、重载==运算符
现在我们再来创建一个Person类像下面这样的,如下所示,重载了==运算符,并且只返回 false:
public class Person
{
public static bool operator ==(Person x, Person y)
{
return false;
}
public static bool operator !=(Person x, Person y)
{
return !(x == y);
}
public override bool Equals(object obj)
{
return base.Equals(obj);
}
}
现在运行控制台应用程序时,可以看到下面的输出结果:
Is Person null?
== says: False
is says: True
is关键字运行的结果是正确的,因为person变量实际上是null,但是重载过的的操作符返回的结果可能就不同。
总结
因此在代码中我们可以进行明智的选择,如果想要进行null的判断,is关键字就是最好的选择。你一旦使用习惯了,它在代码中看起来是比较清晰简洁。
原文:https://www.thomasclaudiushuber.com
作者:Thomas Claudius Huber
优秀是一种习惯,欢迎大家关注学习

C# 为什么你应该更喜欢 is 关键字而不是 == 运算符的更多相关文章
- 为什么更喜欢Outlook,而不是Gmail
让我写这篇博客主要前段时间dudu写了一篇关于Google Gmail年龄限制问题,导致博客园管理员Gmail账号会被删除,里面的邮件无法迁移出来.围观地址:http://www.cnblogs.co ...
- Linq表达式、Lambda表达式你更喜欢哪个?
什么是Linq表达式?什么是Lambda表达式? 如图: 由此可见Linq表达式和Lambda表达式并没有什么可比性. 那与Lambda表达式相关的整条语句称作什么呢?在微软并没有给出官方的命名,在& ...
- 【转】Linq表达式、Lambda表达式你更喜欢哪个?
[转]Linq表达式.Lambda表达式你更喜欢哪个? 什么是Linq表达式?什么是Lambda表达式? 如图: 由此可见Linq表达式和Lambda表达式并没有什么可比性. 那与Lambda表达式相 ...
- haskell,lisp,erlang你们更喜欢哪个?
haskell,lisp,erlang你们更喜欢哪个? haskell,lisp,erlang你们更喜欢哪个?
- 【转载】javascript 杂谈之哪种写法你更喜欢?
转载自:http://www.cnblogs.com/baochuan/archive/2012/04/30/2473771.html 思维导图 介绍 老是在写js,你平时是怎么写你的js呢?更 ...
- 六种流行的语言大餐---C、C++、python、Java、php、C#你更喜欢哪一个呢?
引言 鉴于五一期间超大的人流量,LZ思来想去,最终还是选择蜗居在自己的出租屋.无聊之际,当然不能忘了做点什么事情,于是LZ就研究了一下几种语言的皮毛,在这里献丑一翻,希望各位猿友莫要见笑. 不过说来也 ...
- 缓存策略 半自动化就是mybaitis只支持数据库查出的数据映射到pojo类上,而实体到数据库的映射需要自己编写sql语句实现,相较于hibernate这种完全自动化的框架我更喜欢mybatis
springboot入门(三)-- springboot集成mybatis及mybatis generator工具使用 - FoolFox - CSDN博客 https://blog.csdn.net ...
- robot framework设置更高级别的关键字
robot framework中除了内置的关键字,以及低级别的用户自定义关键字外,为了使用例更加整洁,我们还可以形成更高级别的关键字 方法如下: 在Keywords里面设置 其中Run Success ...
- springboot 使用maven 打包 报 (请使用 -source 7 或更高版本以启用 diamond 运算符) 错误解决办法
在使用springboot maven 打包时 报如下错误 (请使用 -source 7 或更高版本以启用 diamond 运算符) pom.xml编译插件 配置如下: <plugin> ...
随机推荐
- 最新Unity 与Android 交互通信(基于Unity 2019.4 和 Android Studio 4.1.1)
原文章链接:https://blog.csdn.net/woshihaizeiwang/article/details/115395519 CLSays:网上找了一圈,真的是很多都不能用,要么太老,要 ...
- Jenkins CI&CD 自动化发布项目实战(下篇)
Jenkins CI&CD 自动化发布项目实战(下篇) 作者 刘畅 时间 2020-12-04 实验环境 centos7.5 主机名 ip 服务配置 软件 gitlab 172.16.1.71 ...
- Linux搭建私有yum源
一.前期准备 环境:CentOS 8.3 镜像: CentOS-7-x86_64-Everything-2009.iso CentOS-8.3.2011-x86_64-dvd1.iso 二.搭建步骤 ...
- springBoot-Quartz快速入门
springBoot-Quartz快速入门 开发环境 JDK1.8.Maven.Idea 技术栈 SpringBoot 2.1.6.quartz 2.3.0等 数据库准备 说明:数据库脚本由Quart ...
- Tomcat 中文乱码,设置UTF-8
1.修改tomcat的conf目录下 server.xml文件加上 URIEncoding="UTF-8" <Connector port="8080" ...
- 接口自动化框架搭建Unittes+HTMLTestRunner
本次主要尝试搭建接口自动化框架,基于 unittest+HTMLTestRunner 框架主要模块: config: 存放配置文件 lib: 封装了一些接口前置函数:处理各种事物 log: 存放生成的 ...
- APDU:APDU常用指令
APDU= ApplicationProtocol data unit, 是智能卡与智能卡读卡器之间传送的信息单元, (给智能卡发送的命令)指令(ISO 7816-4规范有定义) CLA INS P1 ...
- Redis:Redis的安装
Redis优势 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s . 丰富的数据类型 – Redis支持二进制案例的 Strings, Li ...
- 其他:Git生成SSH、Git生成本地库、下载远程库代码 命令
1.安装Git Bash https://git-scm.com/downloads 2.鼠标右键git bash here 3.执行以下命令: ① cd ~/.ssh/ [如果没有对应的文 ...
- Flyway:Spring Boot中使用Flyway来管理数据库版本
Flyway简介 Flyway是一个简单开源数据库版本控制器(约定大于配置),主要提供migrate.clean.info.validate.baseline.repair等命令.它支持SQL(PL/ ...