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

标签 c# performance reflection types

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

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

public class DefComparer : IComparer<object> {
    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;
        }

这支持所有原语。对于自定义对象,在 TypeCode.Object 中写入 else if 语句。

希望对您有所帮助。

关于c# - 检查类型最快的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17774255/

相关文章:

python - 非 ASCII Python 标识符和反射率

c# - 线程可以作为另一个用户执行吗? (.NET 2.0/3.5)

c# - "final"在 IL 中是什么意思?

c# - 如何使用 Regex 仅获取字符串中字符开头和结尾的数字?

c# - 将包含所有表和列名的 SQL 语句添加到字典中

c++ - 是否可以删除此条件语句?

.Net 4.0 应用程序中的 .Net 3.5 Dll 存在任何问题

python - 在 python 中快速计算 XMX^T 对角线的方法

java - 通过反射实例化静态抽象类

c# - ExtractExistingFileAction.OverwriteSilently 不会覆盖给定目录中的文件