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

我已经看到在我维护的一些代码中完成,但不知道区别。 有一个吗?

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

两者的结果在你的情况是完全一样的。 这将是从System.Type派生的自定义types。 这里唯一真正的区别是,当你想从你的类的实例中获得types时,你使用GetType 。 如果你没有一个实例,但你知道types名称(只需要实际的System.Type来检查或比较),你可以使用typeof

重要的区别

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

GetType()用于在运行时查找对象引用的实际types。 这可能与引用对象的variables的types不同,因为inheritance。 typeof()创build一个types文字,它是指定的确切types,并在编译时确定。

是的,如果您有来自客户的inheritancetypes,则会有所不同。

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

typeof(foo)在编译期间被转换成一个常量。 foo.GetType()在运行时发生。

typeof(foo)也直接转换成它的types的常量(即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) 

首先,你需要一个实际的实例(即myCustomer),第二个你不需要

typeof在编译时执行,而GetType在运行时。 这两种方法是如此不同。 这就是为什么当处理types层次结构时,只需运行GetType即可findtypes的确切types名称。

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

// typeof运算符将一个types作为参数。 这是在编译时解决的。

 //The GetType method is invoked on an object and is resolved at run time. //The first is used when you need to use a known Type, the second is to get // the type of an object when you don't know what it is. class BaseClass { } class DerivedClass : BaseClass { } class FinalClass { static void RevealType(BaseClass baseCla) { Console.WriteLine(typeof(BaseClass)); // compile time Console.WriteLine(baseCla.GetType()); // run time } static void Main(string[] str) { RevealType(new BaseClass()); Console.ReadLine(); } } 

// * **通过Praveen Kumar Srivastava