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,且说明为什么会输出这样的结果.
{
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,且说明为什么会输出这样的结果.
类型一样,自然是true;
Equals 的默认实现仅支持引用相等,但派生类可重写此方法以支持值相等。对于引用类型,相等定义为对象相等;即这些引用是否引用同一对象。对于值类型,相等定义为按位相等。ValueType 类支持值类型。在调用 objA.Equals(objB) 前,此方法首先检查两个参数是否均为空引用
为什么实例只有一个?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的类型不同吗?似呼和类型是没有关系的,还是要说到引用上.
{
.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代码,似呼应该能找到答案吧?
能给我讲一下,为什么会得到同一个实例呢?实现的过程是怎么样的?我是指从CLR或者编译器的角度.
type 是一样的估计获取 type 用的是 reflection 吧
每个类型的实例保存在一个列表中?还是某类对象的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 的类关联的元数据。
Object.ReferenceEquals
Object.Equals
也就是说二者没有区别,仅有的区别在于Object.ReferenceEquals是静态方法,不能重写,而Object.Equals留了一个Virtual的版本.不知道我的说法对不对.
Object.Equals 方法 确定两个 Object 实例是否相等。因为A与B对象是完全相等的。
同意ms44(ms44)
他的讲述不清楚.说是比较引用,怎么又说类型相同就应该为True.至少应该说引用相同,所以为True.
True.
Object.Equals 方法 确定两个 Object 实例是否相等。
因为A与B对象是完全相等的。//////////////////////////////////////////////////////////////////
我感觉你的理解也不是很透彻,说法上有些含糊不清,你怎么能判断两个对象是完全相等的?除非你重写Equals才能确定对象的字符,属性是不是完全一样的.而Object.Equals是确定两个引用是否指向同一个对象.
同一个对象,因为CTS对GetType使用了Cache
//////////////////////////////////////////////////////////////
不知道别人还有无异议了,呵,只有这个解释差不多才算是合理的.//////////////////////////////////////////////////////////////
回复人: w1231313131(lllllkk) ( ) 信誉:100 2005-07-18 17:24:00 得分: 0
《.Net框架程序设计》 网上有的载吗
///////////////////////////////////////////////////////////////
有,不过我找到的都是英文版,中文的没有.