一:背景

1. 讲故事

最近发现 C#7 之后的 is 是越来越看不懂了,乍一看花里胡哨的,不过当我静下心来仔细研读,发现这 is 是越来越短小精悍,而且还特别语义化,那怎是一个爽字了得,这一篇就和大家简单聊一聊。

二:C#7 之前的 is 如何使用

1. 类型兼容性检测

相信学过 C# 的朋友都会知道 is 是干嘛的,而且还经常和 as 一起比较,前者一般做兼容性检测,后者一般做兼容性转换,这里我就举个例子吧:


static void Main(string[] args)
{
object slot = new Slot() { ClothesName = "上衣" }; if (slot is Slot)
{
Console.WriteLine($"slot is {nameof(Slot)}");
} if (slot is IComparable)
{
Console.WriteLine($"slot is {nameof(IComparable)}");
}
} public class Slot : IComparable
{
public string ClothesName { get; set; } public int CompareTo(object obj) {return 0;}
}

从这个例子可以看到, object 类型的 slot 和 Slot, IComparable 都是类型兼容的,非常简单。

2. 遗憾的地方

然而在实际编码中,我相信有很多朋友都会在后续的过程中用到 slot 实例,而上面的这个例子,即使我用 is 检测到了是 Slot 类型,最后我还是要 将 object slot 强转成 Slot类型,做了一次检测,又做了一个强转,这就很奇葩了,如下代码:


if (slot is Slot)
{
var query = (Slot)slot;
Console.WriteLine($"slot is {nameof(Slot)}, ClothesName={query.ClothesName}");
}

除非有毛病才写这样的代码,干嘛不直接用 as 尝试性转换将两步合为一步走呢? 修改代码如下:


var query = slot as Slot; if (query != null)
{
Console.WriteLine($"slot is {nameof(Slot)}, ClothesName={query.ClothesName}");
}

这就导致很多场景下,is 都被 as 替代了,搞的 is 成了一个空架子,如果 is 能合并 as 的功能,那就

最新文章

  1. (转)利用libcurl获取新浪股票接口, ubuntu和openwrt实验成功(三)
  2. 【DS】About Stack
  3. [ 转载 ] kernel32.BaseThreadInitThunk
  4. MVC1笔记
  5. java比较相等符
  6. 学习第一个头文件stdio.h
  7. pip源相关问题
  8. JavaScript的对象/下
  9. hdu 5646DZY Loves Partition(构造)
  10. ThreadLocal基本原理及运用
  11. DS博客作业02--线性表
  12. webdriver之select、alert、prompt、confirm
  13. BOM模型中常用对象 定义计数器 网页跳转 网页前进后退
  14. QQ浏览器中时区bug
  15. HTTPS 通讯流程
  16. UI5-学习篇-16-云端SCP-Destination配置
  17. SNOI 滚粗记
  18. redis 负载均衡 集群配置
  19. HBASE--MapReduce
  20. RabbitMQ如何解决各种情况下丢数据的问题

热门文章

  1. wordpress个人常用标签调用
  2. SecureCRT 关键字高亮显示
  3. opencv 截图并保存
  4. Javascript数组与函数初识
  5. Linux下关闭和开启IPv6的方法
  6. 快速幂 (C++)
  7. mysql表中时间timestamp设计
  8. Android项目智能机器人的实现,带有源代码,图灵智能机器人,详细讲解。。
  9. boot磁盘空间大于80警报
  10. ubuntu安装docker-ce 、docker-ce-cli、containerd.io