解释性说明:
Object 是所有类的基类,引用类型派生于Object。值类型虽然派生于valuetype(它本生派生于Object ,不过它们被定义了seal)。
Type 在MSDN描述为表示类型声明。而Type多数被使用反射中,可以方便得到类内部成员信息。Gettype 与typeof分别用可以在动态获得运行的类型和静态得到实例的类型
如下代码:
int k=0;
Type type = k.GetType();
Type type1 = typeof(Int32);
考虑上面k.GetType()。如果上面k是一个引用类型同样也可以,在Type类中有一个GetType()方法,所以类是隐性继承于Object,Object中GetType方法,Type类也一样,同样隐性继承于Object,这才是关键,Reflection Type类中GetType,会发现如下Type.GetType(),Type.GetType (String)Type.GetType (String, Boolean) ,Type.GetType (String, Boolean, Boolean) Type类重载了很多GetType方法,仅Type.GetType()是被override ,写到这里时我发现一个很有意思的地方,Framework2.0定义:public override sealed Type GetType (),描述:重载获取表示指定类型的 Type 对象在Framework3.5定义为:public Type GetType(),在使用Reflecation工具后发现Object类中被这样定义 protected extern object MemberwiseClone(); 它的实现交给了实现具体类的GetType()方法,不过它是隐藏的方法。如果直接public Type GetType()编译时会提示,用new去覆盖。
考虑如下代码
public class MyClass
{
public MyClass()
{ }
public new Type GetType()
{
return typeof(System.Int32);
}
}
public void Test()
{
MyClass myclass = new MyClass();
Type type4= myclass.GetType();
}
结果是返回Int32,将上面代码做一下调整。
public void Test()
{
Type Type5 = typeof(MyClass);
}
结果是MyClass。
说明GetType与typeof实现上机制是不一样的,GetType是在运行时动态获取,而typeof是静态获取。GetType方法返回一个表对象运行时的Type,Object替代了这种实现。Object可以GetType出来,但是new Type是出不来Object的,因为public abstract class Type,不可被实例化,Type类只是所有成员的索引角色。Object可以指向一任意一个类型的任何给定的实例。Object更像一个"型"。Type才是一个类。
以上的分析,就不难理解为什么平时只会在装箱或拆箱时见到最多的Object ,而Type更多时候在反射时用到,可有时在传递时仅需要一个Object时,可能会传递一个Type,然后再构造它。现在查看自己代码吧!了解Object与Type这对代码优化是有好处的。