类型码VS的typeof

问题描述:

如果我需要一些特定类型的代码,我可以用typeof例如:类型码VS的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 || 
} 

什么是使用的好处TypeCodetypeof从建筑和性能角度?在这种情况下,我应该使用两者中的哪一个?

FYI,代码从一个值获得type/typeCode

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

PS:这些实施例非常简化。

PS 2:如果我通过该值,我也可以使用as,is等。但在这种情况下,我不喜欢发送,因为该方法不需要知道该值,只有它的类型。

+0

我很确定前面的代码片断会更高效。基于这一点,在编译时和运行时执行'typeof()'这一事实。它也不需要'Convert.GetTypeCode()'调用。你可以随时对它进行基准测试,然后看看自己! – itsme86

+0

GetTypeCode隐藏在.NET版本1中。在没有泛型的绝望日子里,让交换语句高效地回到那些黑暗的doomy中非常重要。他们甚至修正了版本7中的switch语句。 –

TypeCode当您遵循几条可能的路径时,最有效,并且大部分或全部逻辑都可以通过单独检查代码来完成,因为这样会非常高效,而且通常非常清晰。

在其他情况下,Object分支内部可能与外部拥有尽可能多的逻辑,因为这是大多数类型的代码,在这种情况下,它不会像先检查代码那样有用,除非可能由它服务得很好也是经常出现的情况。

IsNumeric例子是,当TypeCode效果很好,如果你是重写您正在使用一个虚拟呼叫应答获得编译为相对高效的跳跃,而不是分行代码和排序的一个开关的开关的一个很好的例子对不同可能类型的多重比较。

请注意,枚举类型与其基础数值类型具有相同的代码。无论这种情况是否包括免费提供的这些案件,还是作为一个案例,您都必须分别采取防范措施,这取决于您希望如何将这些类型用于任何目的。

的几个注意事项,我才回答:

  1. typeof需要一个类型(不是实例)
  2. GetTypeCode要求实现IConvertible接口

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


这是从MSDN:

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

因此,如果一个类型不实现IConvertible接口,那么你需要做2个呼叫:GetType,然后调用GetTypeCode。我还拉从.NET源代码的代码GetTypeCode

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. 上在某些情况下
  5. 更直截了当
  6. 不是2来电

我会去typeof

我永远记住这条规则:

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

+1

'GetTypeCode'不需要实现'IConvertible'接口的实例,你可以在任何类型上调用'Type.GetTypeCode()'。 –

+0

它看起来像'GetTypeCode()'扩展方法只适用于实现'IConvertible'的对象,但您可以将任何类型传递给'Type.GetTypeCode()'方法。 – BurnsBA