热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#学习教程:通常检查null,不会在非约束类型上包含nullables。分享

通常检查null,不会在非约束类型上包含nullables。假设我有以下方法:publicstaticintCountNonNullMembers(thisIEnumerablee

通常检查null,不会在非约束类型上包含nullables。

假设我有以下方法:

public static int CountNonNullMembers(this IEnumerable enumerable) { if (enumerable == null) throw new ArgumentNullException("enumerable"); int count = 0; foreach (var x in enumerable) { if (x != null) count++; } return count; } 

我有这3个arrays::

 var ints = Enumerable.Range(0,10).ToArray(); var nullableInts = Array.ConvertAll(ints,x=>x as int?); var strings = Array.ConvertAll(ints,x => x.ToString()); 

我写了一个小函数来做一个循环并计算一百万次迭代。 将它应用于intsstrings ,它在我的机器上完成大约100毫秒。 对于nullableInts ,需要2.5秒。 据我所知,在int上检查null是没有意义的,因此编译器为不可为空的struct类型提供了不同的模板,这将删除空检查。 但是Nullable没有将空检查转换为x.HasValue的模板。 如果我有一个无约束的函数,我怎么能做一个表现良好的空检查? 我不能使用EqualityComparer ,因为null可能不是T的成员,因为没有约束。

也不可能有因约束而不同的重载,所以我不能说,有一个用于structs ,一个用于Nullable ,一个用于类。

该方法的调用者是非约束的。 这只是一个例子(不是实际的方法); 调用方法是非约束的。 我需要针对非null成员做一些工作,这是一种通用方法。 我想我可以编写一个不执行检查的版本与执行该版本的版本(因此具有不同的签名),但它看起来非常难看且不需要。

此外,扩展方法.Count莫名其妙地对NullableIntsstrings执行可怕(同样糟糕),所以它真的不是正确的方法。 这可能是委托调用,但我对此表示怀疑。 使用Check.IfNullUnboxT样式方法Check.IfNull执行得更好。 好吧,真的很奇怪切换计数的主体到这个表现很好:

  public static int CountNonNullMembers(this IEnumerable enumerable) { return enumerable.Count(Check.IfNull.Invoke); } 

为什么?

您可以将generics类型参数约束为引用类型或值类型:

 public static int CountNonNull(this IEnumerable source) where T : class { return source.Count(x => x != null); } public static int CountNonNull(this IEnumerable> source) where T : struct { return source.Count(x => x.HasValue); } 

对于不可为空的结构,您不需要重载,因为它们无论如何都不能为空。

使用UnboxT方法有效。 但我也想要一些不需要创建静态类型的东西::

 public static class Check { public static readonly Predicate IfNull = CreateIfNullDelegate(); private static bool AlwaysFalse(T obj) { return false; } private static bool ForRefType(T obj) { return object.ReferenceEquals(obj, null); } private static bool ForNullable(Tu? obj) where Tu:struct { return !obj.HasValue; } private static Predicate CreateIfNullDelegate() { if (!typeof(T).IsValueType) return ForRefType; else { Type underlying; if ((underlying = Nullable.GetUnderlyingType(typeof(T))) != null) { return Delegate.CreateDelegate( typeof(Predicate), typeof(Check) .GetMethod("ForNullable",BindingFlags.NonPublic | BindingFlags.Static) .MakeGenericMethod(underlying) ) as Predicate; } else { return AlwaysFalse; } } } } 

使用这种方法,一切都表现相同。 Strings表现更差,但并不比其他任何东西差。

虽然不一定比你的方法更好,但它不需要整个类:

上述就是C#学习教程:通常检查null,不会在非约束类型上包含nullables。分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—编程笔记

 static Dictionary NullChecks = new Dictionary(); public static Func MakeNullCheck() { object obj; Func func; if (NullChecks.TryGetValue(typeof(T), out obj)) return (Func)obj; if (typeof(T).IsClass) func = x => x != null; else if (Nullable.GetUnderlyingType(typeof(T)) != null) { var param = Expression.Parameter(typeof(T)); func = Expression.Lambda>( Expression.Property(param, typeof(T).GetProperty("HasValue")), param).Compile(); } else func = x => false; NullChecks[typeof(T)] = func; return func; } 


推荐阅读
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • 实现一个通讯录系统,可添加、删除、修改、查找、显示、清空、排序通讯录信息
    本文介绍了如何实现一个通讯录系统,该系统可以实现添加、删除、修改、查找、显示、清空、排序通讯录信息的功能。通过定义结构体LINK和PEOPLE来存储通讯录信息,使用相关函数来实现各项功能。详细介绍了每个功能的实现方法。 ... [详细]
author-avatar
手机用户2602913361
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有