static void Main(string[] args)
{
System.Collections.ArrayList a=new System.Collections.ArrayList();
System.Collections.ArrayList b=new System.Collections.ArrayList();
if(Object.Equals(a.GetType(),b.GetType()))
Console.WriteLine("TRUE");
else
Console.WriteLine("FALSE");
}不要上机调试,大家认为上面的代码输出的结果是True还是False,且说明为什么会输出这样的结果.

解决方案 »

  1.   

    true这是因为类型的实例只有一个
      

  2.   

    EQUAL比较引用。
    类型一样,自然是true;
      

  3.   

    如果 objA 是与 objB 相同的实例,或者如果两者均为空引用,或者如果 objA.Equals(objB) 返回 true,则为 true;否则为 false。备注
    Equals 的默认实现仅支持引用相等,但派生类可重写此方法以支持值相等。对于引用类型,相等定义为对象相等;即这些引用是否引用同一对象。对于值类型,相等定义为按位相等。ValueType 类支持值类型。在调用 objA.Equals(objB) 前,此方法首先检查两个参数是否均为空引用
      

  4.   

    Jim3:
      为什么实例只有一个?a.gettype()和b.gettype()只产生一个type实例吗?ms44:
      Equals的确是比较引用.
      引用是指什么?我理解是堆内存中对对象的引用.那除非a.gettype()和b.gettype()产生同一个type对象,这样对同一个引用那将是相等的.
      书上说:object.Equals(object A,object B)同部的实现过程是:
             if (A==B) 
                return true;
             else
                return false;
      就是比较引用.
      你所说的类型一样?我不太理解.你是说A和B产生的类型都是Type类的实例就会相等吗?那如果Object.Equals(a,b),结会是会是假的,a和b的类型不同吗?似呼和类型是没有关系的,还是要说到引用上.
      

  5.   

    .method private hidebysig static void  Main(string[] args) cil managed
    {
      .entrypoint
      .custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 ) 
      // 代码大小       54 (0x36)
      .maxstack  2
      .locals init ([0] class [mscorlib]System.Collections.ArrayList a,
               [1] class [mscorlib]System.Collections.ArrayList b)
      IL_0000:  newobj     instance void [mscorlib]System.Collections.ArrayList::.ctor()
      IL_0005:  stloc.0
      IL_0006:  newobj     instance void [mscorlib]System.Collections.ArrayList::.ctor()
      IL_000b:  stloc.1
      IL_000c:  ldloc.0
      IL_000d:  callvirt   instance class [mscorlib]System.Type [mscorlib]System.Object::GetType()
      IL_0012:  ldloc.1
      IL_0013:  callvirt   instance class [mscorlib]System.Type [mscorlib]System.Object::GetType()
      IL_0018:  call       bool [mscorlib]System.Object::Equals(object,
                                                                object)
      IL_001d:  brfalse.s  IL_002b
      IL_001f:  ldstr      "TRUE"
      IL_0024:  call       void [mscorlib]System.Console::WriteLine(string)
      IL_0029:  br.s       IL_0035
      IL_002b:  ldstr      "FALSE"
      IL_0030:  call       void [mscorlib]System.Console::WriteLine(string)
      IL_0035:  ret
    } // end of method Class1::Main我对IL还不会,请大侠看看IL代码,似呼应该能找到答案吧?
      

  6.   

    的确a.GetType()与b.GetType()确实是得到同一个实例,我用Object.ReferenceEquals(a.GetType(),b.GetType()),这段代码应该可以检验得出来.Jim3:
      能给我讲一下,为什么会得到同一个实例呢?实现的过程是怎么样的?我是指从CLR或者编译器的角度.
      

  7.   

    向高手學習,看來對framework了解的還是太少啊
      

  8.   

    当然是 true
    type 是一样的估计获取 type 用的是 reflection 吧
      

  9.   

    每个类型一个实例保存在一个列表中,所以gettype()返回的是同一个对象《.Net框架程序设计》里有关于这方面的描述
      

  10.   

    我现在就在看<.Net框架程序设计>这个问题是我在第6章遇到的.我不知道你说的这个问题是我看过了还是没有看过,我现在看到第9章,印像中并没有你说的"列表".
    每个类型的实例保存在一个列表中?还是某类对象的Type类的对象保存在列表中?
    还有,你说的这个列表是运行时的还是装配件的结构中的元数据列表?似呼没有运行时的类型列表吧?你说的应该是装配件的结构"PE,CLR头,元数据,IL",在元数据的TypeRef列表吧?我终于找到答案了:
    获取当前实例的 Type。
    Object.GetType 方法  [C#]
    [C#]
    public Type GetType();返回值
    Type 实例,表示当前实例的确切运行时类型。备注
    对于具有相同运行时类型的两个对象 x 和 y,Object.ReferenceEquals(x.GetType(),y.GetType()) 返回 true。Type 对象公开与当前 Object 的类关联的元数据。
      

  11.   

    另外,即然都是查看引用是否为同一个对象,那么:
    Object.ReferenceEquals
    Object.Equals
    也就是说二者没有区别,仅有的区别在于Object.ReferenceEquals是静态方法,不能重写,而Object.Equals留了一个Virtual的版本.不知道我的说法对不对.
      

  12.   

    True.
    Object.Equals 方法  确定两个 Object 实例是否相等。因为A与B对象是完全相等的。
      

  13.   

    回复人: Dr_Jones(kickyourass) ( ) 信誉:100  2005-07-18 14:42:00  得分: 0  
     
     
       同意ms44(ms44)
      
     
    他的讲述不清楚.说是比较引用,怎么又说类型相同就应该为True.至少应该说引用相同,所以为True.
      

  14.   

    回复人: WZCNet(只有想不到,没有做不到) ( ) 信誉:100  2005-7-18 13:47:17  得分: 0  
    True.
    Object.Equals 方法  确定两个 Object 实例是否相等。
    因为A与B对象是完全相等的。//////////////////////////////////////////////////////////////////
    我感觉你的理解也不是很透彻,说法上有些含糊不清,你怎么能判断两个对象是完全相等的?除非你重写Equals才能确定对象的字符,属性是不是完全一样的.而Object.Equals是确定两个引用是否指向同一个对象.
      

  15.   

    同一个对象,因为CTS对GetType使用了Cache
      

  16.   

    《.Net框架程序设计》 网上有的载吗
      

  17.   

    回复人: tiaoci(我挑刺,我快乐) ( ) 信誉:95  2005-07-18 17:12:00  得分: 0  
       同一个对象,因为CTS对GetType使用了Cache
    //////////////////////////////////////////////////////////////
    不知道别人还有无异议了,呵,只有这个解释差不多才算是合理的.//////////////////////////////////////////////////////////////
    回复人: w1231313131(lllllkk) ( ) 信誉:100  2005-07-18 17:24:00  得分: 0  
       《.Net框架程序设计》 网上有的载吗
    ///////////////////////////////////////////////////////////////
    有,不过我找到的都是英文版,中文的没有.
     
      

  18.   

    csdn 里面原来有 http://blog.csdn.net/Ninth/category/39069.aspx