有没有做面粉美食的网站,wordpress博客源码,wordpress开发文档pdf,seo关键词排名优化推荐一#xff1a;背景 1. 讲故事最近发现 C#7 之后的 is 是越来越看不懂了#xff0c;乍一看花里胡哨的#xff0c;不过当我静下心来仔细研读#xff0c;发现这 is 是越来越短小精悍#xff0c;而且还特别语义化#xff0c;那怎是一个爽字了得????#xff0c;这一篇就和… 一背景 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 的功能那就????????了我觉得这个急需增强。三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});}这段代码表面意思是先用 is 检测 slot 是否为 Slot 类型如果是就赋值给 Slot 类型的 query 变量哈哈有点意思吧为了验证是否如我所说用反编译工具看看。ILSpy 反编译DnSpy 反编译可以看到在实操中编译器都用 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# 中了有意思吧上代码object e 150;if (e is null){Console.WriteLine(e is null);}if (e is not null){Console.WriteLine(e is not null);}这么语义化的写法在C#中看到是不是有点不习惯那为啥在 sql 中就习以为常呢其实反编译过来也没啥就是一个 判断如下代码3. is 和 and or 的结合现在大家都看到了 is 通常是放在 if 语句中既然在 if 语句中那肯定有很多的逻辑判断这就需要结合 andor 构建非常复杂的逻辑关系不要眼花哦。object e 150;if (e is 100 and 200){Console.WriteLine($e{e} 果然 大于 100 并且 小于 200);}if (e is 100 or 150 or 200){Console.WriteLine($e{e} 是在 100,150,200 三个数字中);}if (e is not null and not ){Console.WriteLine($e{e}模拟 !string.IsNullOrEmpty 功能);}可以看到最后的: e is not null and not 其实等价于 !string.IsNullOrEmpty, 是不是有点意思哈。这里有一点要提醒的是上面的 e 在编译器层面都是 object 类型如果你想在 编译器层面使用 int 运作还是用 例子1 的方式转换一下哈如下图所示4. is 和 var 的结合当 is 和 var 结合起来就更????????了可以实现在 if 判断的过程中生成临时变量如下代码int e 150;if (e is var i i 100 i 200){Console.WriteLine($e{i} 果然 大于 100 并且 小于 200);}上面代码中的 i 就是一个临时变量后面做的一切业务逻辑都是基于 i 这个临时变量的如果还没有领会到精粹没关系我举一个项目中的例子吧。。。我们公司是搞衣物洗涤自动化也需要对线下 传输线上的衣服进行自动化上挂取走和衣物组合搭配举个例子找到 刚好挂了一件裤子L 一件上衣L 总衣服个数2 的 挂孔号要是还没听懂就算了直接上代码说话。
class Program{static void Main(string[] args){var slotList new ListSlot(){new Slot() {SlotID1, ClothesID10,ClothesName上衣, SizeName L },new Slot() {SlotID1, ClothesID20,ClothesName裤子, SizeName M },new Slot() {SlotID1, ClothesID11,ClothesName皮带, SizeName X },new Slot() {SlotID2, ClothesID30,ClothesName上衣, SizeName L },new Slot() {SlotID2, ClothesID40,ClothesName裤子, SizeName L }};//找到 刚好挂了一件裤子L 一件上衣L 总衣服个数2 的 挂孔号var query slotList.GroupBy(m m.SlotID).Where(m m.Where(n n.SizeName L).ToList() is var clothesList clothesList.Count(k k.ClothesName 裤子) is 1 clothesList.Count(k k.ClothesName 上衣) is 1 m.Key 2).ToDictionary(k k.Key, v v.ToList());}public class Slot{public int SlotID { get; set; }public int ClothesID { get; set; }public string ClothesName { get; set; }public string SizeName { get; set; }}}重点在于上面代码的 m.Where(n n.SizeName L).ToList() is var clothesList这里的 clothesList 就是临时变量它存放了所有 尺寸L 的衣物,后续的检索都是基于这个 clothesList是不是大大提高了检索速度~~~四总结 我觉得 is 的功能增强早就该出现了现在终于搞定了越来越人性化键盘敲击次数越来越少头发也不落了甚至又开始第二春了总的来说还是那句话C# 大法????????。