如果我需要某些类型特定的代码,我可以使用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:如果我传递了该值,我也可以使用as
,is
等。但在这种情况下,我不想发送,因为该方法不会需要知道价值,只知道它的类型。
答案 0 :(得分:5)
TypeCode
效果最好,并且可以通过单独检查代码来完成大部分或全部逻辑,因为switch
这将是非常有效的,并且通常很清楚。
在其他情况下,您可能在Object
分支内部具有与外部一样多的逻辑,因为这是大多数类型的代码,在这种情况下,除非可能首先检查代码,否则它往往不那么有用由它提供良好服务的案件也是特别经常出现的案例。
您的IsNumeric
示例是TypeCode
何时正常工作的一个很好的示例,就像您将其重写为您正在回答一个虚拟调用以获取代码的交换机和一个编译类型的交换机相对有效的跳跃而不是分支在不同可能类型的多重比较上。
请注意,枚举类型与其基础数字类型具有相同的代码。这是否意味着免费提供这些案件,或者您必须单独防范这种情况取决于您希望如何考虑这些类型,无论您的目的是什么。
答案 1 :(得分:2)
我回答之前的几点说明:
typeof
采用类型(非实例)GetTypeCode
需要一个实现IConvertible
接口因此他们是不同的。所以你需要问自己的问题是你想要一个实例的类型还是一个类型。
这是来自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
的事实是:
我会选择typeof
。
我一直记得这条规则:
首先让它发挥作用。然后,只有当你需要让它更快地工作时,才能改变它。