Csharp/C#教程:检查类型的最快方法是什么?分享


检查类型的最快方法是什么?

我决定在一个函数中检查类型,而不是将函数重载100次或为不同类型创建100个不同的比较器。

例如,我使用默认比较器来比较2个对象中的一组类型(基元和字符串)的值。 它包含以下代码:

public class DefComparer : IComparer { public int Compare(object a, object b) { .... // a = a.GetType().GetField(field).GetValue(a); - not important for the question but I'm just showing that a&b below are different references switch (a.GetType().Name) { case "Byte": if ((byte)a == (byte)b) return 0; else if ((byte)a > (byte)b) return 1; else return -1; case "UInt16": if ((ushort)a == (ushort)b) return 0; else if ((ushort)a > (ushort)b) return 1; else return -1; case "SByte": if ((sbyte)a == (sbyte)b) return 0; else if ((sbyte)a > (sbyte)b) return 1; else return -1; case "Int16": ... 

这里我使用的是一个switch语句,据说比if / else语句链更快。 但是a.GetType().Name返回一个动态获得的字符串,该方法涉及字符串比较。 这对我来说听起来不是特别快。 我需要Comparer在技术上尽可能快,因为它将用于大量数据集合。

问:有没有更快的方法来检查对象的类型(不涉及字符串比较)? 什么是最快的方式?

好吧,你手里拿着它。 使用TypeCode

  int a = 10; Type t = a.GetType(); switch (Type.GetTypeCode(t)) { case TypeCode.Boolean: break; case TypeCode.Byte: break; case TypeCode.Char: break; case TypeCode.DBNull: break; case TypeCode.DateTime: break; case TypeCode.Decimal: break; case TypeCode.Double: break; case TypeCode.Empty: break; case TypeCode.Int16: break; case TypeCode.Int32: break; case TypeCode.Int64: break; case TypeCode.Object: break; case TypeCode.SByte: break; case TypeCode.Single: break; case TypeCode.String: break; case TypeCode.UInt16: break; case TypeCode.UInt32: break; case TypeCode.UInt64: break; default: break; } 

这支持所有原语。 对于Custom对象在TypeCode.Object写入else if语句。

我希望这有帮助。

从评论中,听起来好像你有一堆结构化数据,各种类型的子对象。

如果集合很大,最快的方法是使用动态codegen(可能使用表达式树)来创建一个单一方法,以强类型方式提取所有感兴趣的字段/属性,并执行强类型比较。

基本上,您使用reflection从集合成员类型动态获取字段/属性类型。 然后构建MemberAccessExpression表达式,将它们传递给Expression.Equal ,并将所有结果传递给Expression.AndAlso 。 编译表达式会为您提供一个委托,该委托接收集合中包含的特定类型的两个对象。

启动时间比您在问题中显示的代码慢几个数量级,但每个对象的成本会低很多。 你必须进行测试才能看到盈亏平衡点的位置 – 但可能是成千上万。

上述就是C#学习教程:检查类型的最快方法是什么?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1023830.html

(0)
上一篇 2022年1月7日
下一篇 2022年1月7日

精彩推荐