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(); }