是与typeof

哪些代码段速度更快?

if (obj is ClassA) {} if (obj.GetType() == typeof(ClassA)) {} 

编辑:我知道他们不做同样的事情。

这应该回答这个问题,然后一些。

第二行if (obj.GetType() == typeof(ClassA)) {}更快,对于那些不想阅读文章的人来说,

如果他们不这样做,哪个更快? 比较具有不同含义的语句的performance似乎是一个坏主意。

告诉你该对象是否在types层次中的任何地方实现了ClassAGetType()告诉你最衍生的types。

不一样的事情。

他们不这样做。 如果obj是ClassAtypes或ClassA的某个子类,则第一个工作。 第二个只会匹配ClassAtypes的对象。 第二个将会更快,因为它不需要检查类层次结构。

对于那些想知道原因的人来说,不希望看到引用的文章是vs typeof 。

我做了一些基准testing,他们也是一样的 – 密封types。

 var c1 = ""; var c2 = typeof(string); object oc1 = c1; object oc2 = c2; var s1 = 0; var s2 = '.'; object os1 = s1; object os2 = s2; bool b = false; Stopwatch sw = Stopwatch.StartNew(); for (int i = 0; i < 10000000; i++) { b = c1.GetType() == typeof(string); // ~60ms b = c1 is string; // ~60ms b = c2.GetType() == typeof(string); // ~60ms b = c2 is string; // ~50ms b = oc1.GetType() == typeof(string); // ~60ms b = oc1 is string; // ~68ms b = oc2.GetType() == typeof(string); // ~60ms b = oc2 is string; // ~64ms b = s1.GetType() == typeof(int); // ~130ms b = s1 is int; // ~50ms b = s2.GetType() == typeof(int); // ~140ms b = s2 is int; // ~50ms b = os1.GetType() == typeof(int); // ~60ms b = os1 is int; // ~74ms b = os2.GetType() == typeof(int); // ~60ms b = os2 is int; // ~68ms b = GetType1<string, string>(c1); // ~178ms b = GetType2<string, string>(c1); // ~94ms b = Is<string, string>(c1); // ~70ms b = GetType1<string, Type>(c2); // ~178ms b = GetType2<string, Type>(c2); // ~96ms b = Is<string, Type>(c2); // ~65ms b = GetType1<string, object>(oc1); // ~190ms b = Is<string, object>(oc1); // ~69ms b = GetType1<string, object>(oc2); // ~180ms b = Is<string, object>(oc2); // ~64ms b = GetType1<int, int>(s1); // ~230ms b = GetType2<int, int>(s1); // ~75ms b = Is<int, int>(s1); // ~136ms b = GetType1<int, char>(s2); // ~238ms b = GetType2<int, char>(s2); // ~69ms b = Is<int, char>(s2); // ~142ms b = GetType1<int, object>(os1); // ~178ms b = Is<int, object>(os1); // ~69ms b = GetType1<int, object>(os2); // ~178ms b = Is<int, object>(os2); // ~69ms } sw.Stop(); MessageBox.Show(sw.Elapsed.TotalMilliseconds.ToString()); 

通用函数来testinggenericstypes:

 static bool GetType1<S, T>(T t) { return t.GetType() == typeof(S); } static bool GetType2<S, T>(T t) { return typeof(T) == typeof(S); } static bool Is<S, T>(T t) { return t is S; } 

我也尝试过自定义types,结果是一致的:

 var c1 = new Class1(); var c2 = new Class2(); object oc1 = c1; object oc2 = c2; var s1 = new Struct1(); var s2 = new Struct2(); object os1 = s1; object os2 = s2; bool b = false; Stopwatch sw = Stopwatch.StartNew(); for (int i = 0; i < 10000000; i++) { b = c1.GetType() == typeof(Class1); // ~60ms b = c1 is Class1; // ~60ms b = c2.GetType() == typeof(Class1); // ~60ms b = c2 is Class1; // ~55ms b = oc1.GetType() == typeof(Class1); // ~60ms b = oc1 is Class1; // ~68ms b = oc2.GetType() == typeof(Class1); // ~60ms b = oc2 is Class1; // ~68ms b = s1.GetType() == typeof(Struct1); // ~150ms b = s1 is Struct1; // ~50ms b = s2.GetType() == typeof(Struct1); // ~150ms b = s2 is Struct1; // ~50ms b = os1.GetType() == typeof(Struct1); // ~60ms b = os1 is Struct1; // ~64ms b = os2.GetType() == typeof(Struct1); // ~60ms b = os2 is Struct1; // ~64ms b = GetType1<Class1, Class1>(c1); // ~178ms b = GetType2<Class1, Class1>(c1); // ~98ms b = Is<Class1, Class1>(c1); // ~78ms b = GetType1<Class1, Class2>(c2); // ~178ms b = GetType2<Class1, Class2>(c2); // ~96ms b = Is<Class1, Class2>(c2); // ~69ms b = GetType1<Class1, object>(oc1); // ~178ms b = Is<Class1, object>(oc1); // ~69ms b = GetType1<Class1, object>(oc2); // ~178ms b = Is<Class1, object>(oc2); // ~69ms b = GetType1<Struct1, Struct1>(s1); // ~272ms b = GetType2<Struct1, Struct1>(s1); // ~140ms b = Is<Struct1, Struct1>(s1); // ~163ms b = GetType1<Struct1, Struct2>(s2); // ~272ms b = GetType2<Struct1, Struct2>(s2); // ~140ms b = Is<Struct1, Struct2>(s2); // ~163ms b = GetType1<Struct1, object>(os1); // ~178ms b = Is<Struct1, object>(os1); // ~64ms b = GetType1<Struct1, object>(os2); // ~178ms b = Is<Struct1, object>(os2); // ~64ms } sw.Stop(); MessageBox.Show(sw.Elapsed.TotalMilliseconds.ToString()); 

和types:

 sealed class Class1 { } sealed class Class2 { } struct Struct1 { } struct Struct2 { } 

推理:

  1. struct s上调用GetType比较慢。 GetType定义在object类中,不能在子types中重写,因此struct需要被装箱以称为GetType

  2. 在一个对象实例上, GetType速度更快,但非常小。

  3. 在generics上,如果Tclass ,那么速度要快得多。 如果Tstruct ,那么比GetType快,但typeof(T)比两者快得多。Tclass情况下, typeof(T)由于与实际的基础typest.GetType不同而不可靠。

总之,如果你有一个object实例,使用GetType 。 如果你有一个genericstypes,使用is 。 如果您有一个通用的structtypes,请使用typeof(T) 。 如果您不确定genericstypes是引用types还是值types,则使用is 。 如果你想始终与一种风格保持一致(对于密封types),请使用..