起因
今天在更新.Net Runtime(2021-05-31)源码的时候,在is not null的用法,我们先看看如何使用.
is not null
由于个人习惯,在项目中不怎么使用is进行判断,需要类型转换的话,通常会使用as,具体原因是在 写更好的CSharp代码 ,有提到.这里就不多说了,看看新语法 is no null如何使用.
using System;
namespace CharpLearning.Syntax
{
/// <summary>
/// is not null 语法糖
/// 在C# 9 加入
/// </summary>
public class LearnIsNotNull
{
public void IsNotNull(object obj)
{
//之前
if (obj != null)
{
Console.WriteLine("obj != null");
}
//现在可以用,is not null只是语法糖,在编译时,会替换成"!=null"
if (obj is not null)
{
Console.WriteLine("obj is not null");
}
//obj is not null 反编译
/*
if (obj != null)
{
Console.WriteLine("obj is not null");
}
*/
}
}
}
is no null语法,只是语法糖,在编译时,会替换为!=null,以后看到语法不会茫然了.
is和模式匹配组合
namespace CharpLearning.Syntax
{
/// <summary>
/// 增强的模式匹配 和is一起使用
/// c# 9 加入,其实也是语法糖
/// </summary>
public class LearnPatternMatch
{
public bool IsAlpha(char c)
{
return c is >= 'a' and <= 'z' or >= 'A' and <= 'Z';
//JustDecompile反编译结果:
/*
bool flag;
bool flag1;
if (c >= 'a')
{
if (c <= 'z')
{
flag = true;
flag1 = flag;
return flag1;
}
}
else if (c >= 'A')
{
if (c <= 'Z')
{
flag = true;
flag1 = flag;
return flag1;
}
}
flag = false;
flag1 = flag;
return flag1;
*/
}
}
}
又是一个新的语法糖,这个使用就有点香,还是可以提高生产力,不过使用反编译工具ILSpy看的结果不是上面反编译的代码段,而是这样的.
/ CharpLearning.Syntax.LearnPatternMatch
public class LearnPatternMatch
{
public bool IsAlpha(char c)
{
switch (c)
{
case 'A':
case 'B':
case 'C':
case 'D':
case 'E':
case 'F':
case 'G':
case 'H':
case 'I':
case 'J':
case 'K':
case 'L':
case 'M':
case 'N':
case 'O':
case 'P':
case 'Q':
case 'R':
case 'S':
case 'T':
case 'U':
case 'V':
case 'W':
case 'X':
case 'Y':
case 'Z':
case 'a':
case 'b':
case 'c':
case 'd':
case 'e':
case 'f':
case 'g':
case 'h':
case 'i':
case 'j':
case 'k':
case 'l':
case 'm':
case 'n':
case 'o':
case 'p':
case 'q':
case 'r':
case 's':
case 't':
case 'u':
case 'v':
case 'w':
case 'x':
case 'y':
case 'z':
return true;
default:
return false;
}
}
}
这个从IL代码推测应该是JustDecomplie还原的更准确.我们看一下IL代码:
.class public auto ansi beforefieldinit CharpLearning.Syntax.LearnPatternMatch
extends [System.Runtime]System.Object
{
.method public hidebysig specialname rtspecialname instance void .ctor () cil managed
{
IL_0000: ldarg.0
IL_0001: call instance void [System.Runtime]System.Object::.ctor()
IL_0006: nop
IL_0007: ret
}
.method public hidebysig instance bool IsAlpha (
char c
) cil managed
{
.locals init (
[0] bool V_0,
[1] bool V_1
)
//判断>='a' a=97
IL_0000: nop
IL_0001: ldarg.1
IL_0002: ldc.i4.s 97
IL_0004: blt.s IL_000d
//判断<='z' 122
IL_0006: ldarg.1
IL_0007: ldc.i4.s 122
IL_0009: ble.s IL_0019
IL_000b: br.s IL_001d
//判断>='A' A=65
IL_000d: ldarg.1
IL_000e: ldc.i4.s 65
IL_0010: blt.s IL_001d
//判断<='Z' Z=90
IL_0012: ldarg.1
IL_0013: ldc.i4.s 90
IL_0015: ble.s IL_0019
IL_0017: br.s IL_001d
IL_0019: ldc.i4.1
IL_001a: stloc.0
IL_001b: br.s IL_001f
IL_001d: ldc.i4.0
IL_001e: stloc.0
IL_001f: ldloc.0
IL_0020: stloc.1
IL_0021: br.s IL_0023
IL_0023: ldloc.1
IL_0024: ret
}
}
个人能力有限,如果您发现有什么不对,请私信我
如果您觉得对您有用的话,可以点个赞或者加个关注,欢迎大家一起进行技术交流
本文暂时没有评论,来添加一个吧(●'◡'●)