我见过很多人使用以下代码:

Type t = obj1.GetType();
if (t == typeof(int))
    // Some code here

但我知道你也可以这样做:

if (obj1.GetType() == typeof(int))
    // Some code here

或者这个:

if (obj1 is int)
    // Some code here

就我个人而言,我觉得最后一个是最干净的,但我有什么遗漏吗?哪一个最好用,还是个人喜好?


当前回答

我发现,通过以下方法检查某个事物的类型是否等于某个事物:

variableName.GetType()==typeof(int)

其他回答

可以在C#中使用“typeof()”运算符,但需要使用System.IO调用命名空间;如果要检查类型,必须使用“is”关键字。

这取决于我在做什么。如果我需要bool值(例如,确定是否将强制转换为int),我将使用is。如果我确实出于某种原因需要该类型(例如,传递给其他方法),我会使用GetType()。

我相信最后一个也涉及遗传(例如,狗是动物==真),这在大多数情况下更好。

1.

Type t = typeof(obj1);
if (t == typeof(int))

这是非法的,因为typeof只适用于类型,而不适用于变量。我假设obj1是一个变量。这样,typeof是静态的,它在编译时而不是运行时工作。

2.

if (obj1.GetType() == typeof(int))

如果obj1完全是int类型,则为true。如果obj2从int派生,则if条件将为false。

3.

if (obj1 is int)

如果obj1是一个int,或者它派生自一个名为int的类,或者它实现了一个称为int的接口,这就是真的。

当您想在编译时获取类型时,请使用typeof。如果要在执行时获取类型,请使用GetType。很少有任何情况可以使用,因为它进行了强制转换,而且在大多数情况下,最终还是会强制转换变量。

还有第四个选项你还没有考虑(特别是如果你要将一个对象转换为你找到的类型);即用作。

Foo foo = obj as Foo;

if (foo != null)
    // your code here

这只使用一个强制转换,而此方法:

if (obj is Foo)
    Foo foo = (Foo)obj;

需要两个。

更新(2020年1月):

从C#7+开始,您现在可以内联转换,因此“is”方法现在也可以在一次转换中完成。

例子:

if(obj is Foo newLocalFoo)
{
    // For example, you can now reference 'newLocalFoo' in this local scope
    Console.WriteLine(newLocalFoo);
}