//程序入口
static void Main()
{
/* string a = "a"; string b = "a";
* 此时a,b引用指向堆中的同一地址,因为:
* .net字符串驻存机制,JIT编译时建一内部列表,发现内有"a"存在,
* 不分配内存,直接返回引用地址,否则才又重新分配内存^-^
*/
object a = new string('a',1);
//string a = new string('a',1); //分配新内存,返回地址给引用对象a
object b = new string('a', 1);
//string b = new string('a',1); //分配新内存,返回地址给引用对象b
Console.WriteLine(ReferenceEquals(a,b)); //false(a,b引用指向地址不同)
Console.WriteLine(Equals(a,b)); //true(a,b引用指向的地址中存储的值相同)
//false(a,b为除string外的引用类型,==比较引用的地址是否相同)
if (a == b) //true(string引用类型较特殊,==比较其值相同)
{
Console.WriteLine("true");
}
else
{
Console.WriteLine("false");
}
Console.ReadLine();
}
ReferenceEquals:
永远比较2个引用对象所指向的地址是否相同,是比较引用
对于2个值类型,ReferenceEquals永远都为false,因为使用ReferenceEquals(object a,object b)方法后
值类型被重新装箱为新的引用类型实例,自然不会引用相等。
对于2个引用类型,ReferenceEquals则会比较它们是否指向同一地址。
Equals:
永远比较2个对象(无论引用,非引用)的值是否相等,是比较值
==:
对于引用对象比较其引用(string引用类型除外,string是比较值)
对于值类型比较其值