C# 中的 is 真的是越来越强大越来越语义化(推荐)

一:背景

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;}
  }

C# 中的 is 真的是越来越强大越来越语义化(推荐)

从这个例子可以看到, 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}");
   }

C# 中的 is 真的是越来越强大越来越语义化(推荐)

这就导致很多场景下,is 都被 as 替代了,搞的 is 成了一个空架子,如果 is 能合并 as 的功能,那就🐂👃了,我觉得这个急需增强。

三:C#7 之后的 is 如何使用

也终于在 C#7 之后对 is 进行了翻天覆地的语法糖改造,导致你初看已经不明白啦😄😄😄,下面我就一一举例来说明吧。

1. is 和 复杂类型/简单类型 的结合

现在就来看一下怎么用新is 解决刚才两次转换的问题,如下代码:

 object slot = new Slot() { ClothesName = "上衣" };

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

C# 中的 is 真的是越来越强大越来越语义化(推荐)

这段代码表面意思是:先用 is 检测 slot 是否为 Slot 类型,如果是就赋值给 Slot 类型的 query 变量,哈哈,有点意思吧,为了验证是否如我所说,用反编译工具看看。

ILSpy 反编译

C# 中的 is 真的是越来越强大越来越语义化(推荐)

DnSpy 反编译

C# 中的 is 真的是越来越强大越来越语义化(推荐)

可以看到,在实操中,编译器都用 as 进行了还原,不过从代码流畅性来看,ILSpy更🐂👃一点。

除了和类实例比较之外,还可以和 int,string,tuple ...进行比较, 代码如下:

 object e = 150;

   //字符串比较
   if (e is "hello") { }

   //整形比较
   if (e is 10) { }

   //tuple 比较
   if (e is (10, 20)) { }

2. is 和 null 的结合

大家在写 sql 的时候判断某一个字段是否为 null,通常都会这样写: username is null 或者 username is not null ,哈哈,这种写法也被引入到 C# 中了,有意思吧,上代码:

C# 中的 is 真的是越来越强大越来越语义化(推荐)

扫一扫手机访问