TypeCode vs typeof

时间:2017-04-25 22:45:17

标签: c# typeof typing

如果我需要某些类型特定的代码,我可以使用typeof例如:

private static bool IsNumericType(Type type)
{
    return type == typeof(int) || type == typeof(decimal); //etc
}

但我也可以使用枚举TypeCode

private static bool IsNumeric(TypeCode objTypeCode)
{
    return objTypeCode == TypeCode.Int16 || objTypeCode == TypeCode.Int32 || objTypeCode == TypeCode.Int64; // etc ||
}

从架构和性能角度来看,使用TypeCode优于typeof有什么好处?在哪种情况下我应该使用两者中的一个?

仅供参考,从值中获取type / typeCode的代码:

var type = value.GetType();
var typeCode =  Convert.GetTypeCode(value);

PS:这些例子大大简化了。

PS 2:如果我传递了该值,我也可以使用asis等。但在这种情况下,我不想发送,因为该方法不会需要知道价值,只知道它的类型。

2 个答案:

答案 0 :(得分:5)

当你遵循几条可能的路径时,

TypeCode效果最好,并且可以通过单独检查代码来完成大部分或全部逻辑,因为switch这将是非常有效的,并且通常很清楚。

在其他情况下,您可能在Object分支内部具有与外部一样多的逻辑,因为这是大多数类型的代码,在这种情况下,除非可能首先检查代码,否则它往往不那么有用由它提供良好服务的案件也是特别经常出现的案例。

您的IsNumeric示例是TypeCode何时正常工作的一个很好的示例,就像您将其重写为您正在回答一个虚拟调用以获取代码的交换机和一个编译类型的交换机相对有效的跳跃而不是分支在不同可能类型的多重比较上。

请注意,枚举类型与其基础数字类型具有相同的代码。这是否意味着免费提供这些案件,或者您必须单独防范这种情况取决于您希望如何考虑这些类型,无论您的目的是什么。

答案 1 :(得分:2)

我回答之前的几点说明:

  1. typeof采用类型(非实例)
  2. GetTypeCode需要一个实现IConvertible接口
  3. 的实例

    因此他们是不同的。所以你需要问自己的问题是你想要一个实例的类型还是一个类型。

    这是来自MSDN:

      

    对实现IConvertible接口的类调用GetTypeCode方法,以获取该类实例的类型代码。   否则,调用对象的GetType方法获取其Type对象,然后调用Type对象的GetTypeCode方法以获取对象的类型代码。

    因此,如果某个类型未实现IConvertible界面,则需要进行2次调用:GetType,然后调用GetTypeCode。我还从GetTypeCode的.NET源代码中提取代码:

    public static TypeCode GetTypeCode(Type type)
    {
        if (type == null)
            return TypeCode.Empty;
        return type.GetTypeCodeImpl();
    }
    
    protected virtual TypeCode GetTypeCodeImpl()
    {
        // System.RuntimeType overrides GetTypeCodeInternal
        // so we can assume that this is not a runtime type
    
        // this is true for EnumBuilder but not the other System.Type subclasses in BCL
        if (this != UnderlyingSystemType && UnderlyingSystemType != null)
            return Type.GetTypeCode(UnderlyingSystemType);
    
        return TypeCode.Object;
    }
    

    正如你所看到的,那里有很多东西。现在没有基准测试,很难说,但我很确定,因为typeof是编译时间,并且它是C#原生的,团队已经将工作投入其中以使其高效。 typeof的事实是:

    1. 原生于C#
    2. 在编译时决定
    3. 不依赖于界面
    4. 在某些情况下不是2次通话
    5. 更直接
    6. 我会选择typeof

      我一直记得这条规则:

      首先让它发挥作用。然后,只有当你需要让它更快地工作时,才能改变它。