C#中的myCustomer.GetType()和typeof(Customer)有什么区别?

时间:2020-03-06 14:47:05  来源:igfitidea点击:

我已经在维护的一些代码中看到了两者,但是不知道它们之间的区别。有一个吗?

让我补充一点,myCustomer是Customer的一个实例

解决方案

两种情况下的结果在情况下是完全相同的。这将是我们从" System.Type"派生的自定义类型。唯一真正的区别是,当我们想从类的实例中获取类型时,可以使用" GetType"。如果我们没有实例,但是知道类型名称(只需要检查实际的" System.Type"或者进行比较),则可以使用" typeof"。

重要区别

编辑:让我补充说,对GetType的调用在运行时得到解决,而typeof在编译时得到解决。

对于第一个,我们需要一个实际的实例(即myCustomer),对于第二个,我们不需要

是的,如果我们是从客户继承的类型,则有所不同。

class VipCustomer : Customer
{
  .....
}

static void Main()
{
   Customer c = new VipCustomer();
   c.GetType(); // returns typeof(VipCustomer)
}

GetType()用于在运行时查找对象引用的实际类型。由于继承,这可能不同于引用对象的变量的类型。 typeof()创建一个Type文字,该文字与指定的确切类型相同,并在编译时确定。

在编译期间将typeof(foo)转换为常量。 foo.GetType()在运行时发生。

typeof(foo)也直接转换为其类型的常量(即foo),因此这样做将失败:

public class foo
{
}

public class bar : foo
{
}

bar myBar = new bar();

// Would fail, even though bar is a child of foo.
if (myBar.getType == typeof(foo))

// However this Would work
if (myBar is foo)

typeof在编译时执行,而GetType在运行时执行。这就是这两种方法的不同之处。这就是为什么在处理类型层次结构时,只需运行GetType即可找出类型的确切类型名称。

public Type WhoAreYou(Base base)
{
   base.GetType();
}