//String是引用类型,编译器做了特别处理
Console.WriteLine("string:是引用类型,编译器做了特别处理,所以,Equals和==的行为一致");
string m = new string(new char[] { 'y', 'o', 'y', 'o', 'z', 'h', 'u' });
string n = new string(new char[] { 'y', 'o', 'y', 'o', 'z', 'h', 'u' });
Console.WriteLine(m.Equals(n));
Console.WriteLine(m == n);
Console.WriteLine("\n");
Console.WriteLine("字符串类型本身为引用类型,不涉及装箱操作");
object j = m;
object k = n;
Console.WriteLine(j.Equals(k));//比较堆上数据内容
Console.WriteLine(j == k);//比较是否对同一对象的引用
Console.WriteLine(object.ReferenceEquals(j,k));//比较是否对同一对象的引用
Console.WriteLine("\n");
//值类型
Console.WriteLine("值类型");
int a = 4;
int b = 4;
Console.WriteLine(a.Equals(b));//对于值类型,两种比较方式一直
Console.WriteLine(a == b);
Console.WriteLine("\n");
//进行装箱操作,之后成为引用类型
Console.WriteLine("值类型装箱后为引用类型");
object jj = a;
object kk = b;
//在引用类型的情况下,Equals应与ReferenceEquals的行为相同。然而,
//这种在装箱之后成为引用类型的数据,在使用Equals方法时,行为与ReferenceEquals
//不同.object是系统定义的引用类型,因此,对系统内置的引用类型,应尽量使用Equals,
//慎用 ==
Console.WriteLine(jj.Equals(kk));
Console.WriteLine(jj == kk);
Console.WriteLine(object.ReferenceEquals(jj, kk));
Console.WriteLine("\n");
Console.WriteLine("引用类型");
Shao s = new Shao("zhu");
Shao sh = new Shao("zhu");
Console.WriteLine(s.Equals(sh));//引用类型,Equals默认情况下与ReferenceEquals行为相同
Console.WriteLine(s == sh);//引用类型,== 默认的行为与ReferenceEquals的行为相同
//用于比较两个引用类型的对象是否是对于同一个对象的引用。对于值类型它总是返回false
Console.WriteLine(object.ReferenceEquals(s, sh));
class Shao
{
private string Y = null;
public Shao(string kk)
{
Y = kk;
}
}