总结一下:
对于字符串来说,两个比较的都是对象的值,并且是等效的,这是因为MS重写了==运算符和Equals方法所致
对于非字符串的其他引用类型(非匿名类型)两个比较的都是对象的引用,并且是等效的;
对于匿名类型,Equal()方法比较的是类型的状态,如果两个类型的属性和值都相同,就返回true;==比较的是对象的引用。
对于推断类型(弱化类型、隐式类型),如果编译器推断为引用类型,则两个比较的都是对象的引用,并且是等效的,如果推断为值类型,则也是等效的。
public class 鸡
{
public int 身高;
public int 体重;
public int 三围;
public 鸡(int _身高, int _体重, int _三围)
{
身高 = _身高;
体重 = _体重;
三围 = _三围;
}
public 鸡()
{
}
public override string ToString()
{
return string.Format("身高:{0},体重:{1},三围:{2}", 身高, 体重, 三围);
}
}
class Program
{
static void Main(string[] args)
{
//值类型是存储在栈上,编译时分配内存
Console.WriteLine("值类型测试——————");
int a = 1;
int b = 1;
Console.WriteLine(string.Format("a={0},b={1}", a, b));
Console.WriteLine(a.Equals(b));//ture
Console.WriteLine(a == b);//ture
b = 2;
Console.WriteLine(string.Format("a={0},b={1}", a, b));
Console.WriteLine(a.Equals(b));//false
Console.WriteLine(a == b);//false
a = 1;
b = 1;
int temp_b = b;
Console.WriteLine(string.Format("a={0},temp_b={1}", a, temp_b));
Console.WriteLine(a.Equals(temp_b));//ture
Console.WriteLine(a == temp_b);//ture
Console.WriteLine(string.Format("temp_b={0},b={1}", temp_b, b));
Console.WriteLine(temp_b.Equals(b));//ture
Console.WriteLine(temp_b == b);//ture
//引用类型是存储在堆上,运行时分配内存
Console.WriteLine("引用类型测试——————");
鸡 xiao = new 鸡(1, 1, 1);
鸡 da = new 鸡(1, 1, 1);
Console.WriteLine(string.Format("xiao={0},da={1}", xiao, da));
Console.WriteLine(xiao.Equals(da));//false
Console.WriteLine(xiao == da);//false
da = new 鸡(100, 100, 100);
Console.WriteLine(string.Format("xiao={0},da={1}", xiao, da));
Console.WriteLine(xiao.Equals(da));//false
Console.WriteLine(xiao == da);//false
Console.WriteLine(string.Format("xiao和da是分配在不同堆上的,在内存中的地址不一样,Equals和==比较的是内存中的引用地址!"));
鸡 zhong = da;
Console.WriteLine(string.Format("zhong={0},da={1}", zhong, da));
Console.WriteLine(zhong.Equals(da));//ture
Console.WriteLine(zhong == da);//ture
Console.WriteLine("zhong指向da,所以引用的地址一样。故他们使用Equals和==是相等的");
Console.WriteLine("总结:对于非字符串类型的引用类型,这两种符号比较的都是变量的引用,并不是值.");
Console.WriteLine("string特殊引用类型测试——————");
string c = "1";
string d = "1";
Console.WriteLine(string.Format("c={0},d={1}", c, d));
Console.WriteLine(c.Equals(d));//ture
Console.WriteLine(c == d);//ture
c = "2";
Console.WriteLine(string.Format("c={0},d={1}", c, d));
Console.WriteLine(c.Equals(d));//false
Console.WriteLine(c == d);//false
string e = d;
Console.WriteLine(string.Format("e={0},d={1}", e, d));
Console.WriteLine(e.Equals(d));//ture
Console.WriteLine(e == d);//ture
Console.WriteLine("匿名类型测试——————");
var v11 = new { 身高 = 10, 体重 = 10, 三围 = 10};
var w11 = new { 身高 = 10, 体重 = 10, 三围 = 10};
Console.WriteLine(string.Format("v11={0},w11={1}", v11, w11));
Console.WriteLine(v11.Equals(w11));//ture
Console.WriteLine(v11 == w11);//false
var v1 = new { 身高 = 10, 体重 = 10, 三围 = 10, 年龄=100 };
var w1 = new { 身高 = 10, 体重 = 10, 三围 = 10, 年龄 = 100 };
Console.WriteLine(string.Format("v1={0},w1={1}", v1, w1));
Console.WriteLine(v1.Equals(w1));//ture
Console.WriteLine(v1 == w1);//false
Console.WriteLine("推断类型(弱化类型、隐式类型)测试——————");
var v = 1;
var w = 1;
Console.WriteLine(string.Format("v={0},w={1}", v, w));
Console.WriteLine(v.Equals(w));//ture
Console.WriteLine(v == w);//ture
var vv = new 鸡();
var ww = new 鸡();
vv.三围 = 10;
vv.身高 = 10;
vv.体重 = 10;
ww.三围 = 10;
ww.身高 = 10;
ww.体重 = 10;
Console.WriteLine(string.Format("vv={0},ww={1}", vv, ww));
Console.WriteLine(vv.Equals(ww));//false
Console.WriteLine(vv == ww);//false
vv = new 鸡(100,100,100);
ww = new 鸡(100, 100, 100);
Console.WriteLine(string.Format("vv={0},ww={1}", vv, ww));
Console.WriteLine(vv.Equals(ww));//false
Console.WriteLine(vv == ww);//false
Console.WriteLine("对于字符串来说,两个比较的都是对象的值,并且是等效的,这是因为MS重写了==运算符和Equals方法所致");
Console.WriteLine();
Console.WriteLine("对于非字符串的其他引用类型(非匿名类型)两个比较的都是对象的引用,并且是等效的");
Console.WriteLine();
Console.WriteLine("对于匿名类型,Equal()方法比较的是类型的状态,如果两个类型的属性和值都相同,就返回true;==比较的是对象的引用。");
Console.WriteLine();
Console.WriteLine("对于推断类型(弱化类型、隐式类型),如果编译器推断为引用类型,则两个比较的都是对象的引用,并且是等效的,如果推断为值类型,则也是等效的。");
Console.WriteLine();
Console.ReadKey();
//对于字符串来说,两个比较的都是对象的值,并且是等效的,这是因为MS重写了==运算符和Equals方法所致
//对于非字符串的其他引用类型(非匿名类型)两个比较的都是对象的引用,并且是等效的;
//对于匿名类型,Equal()方法比较的是类型的状态,如果两个类型的属性和值都相同,就返回true;==比较的是对象的引用。
//对于推断类型(弱化类型、隐式类型),如果编译器推断为引用类型,则两个比较的都是对象的引用,并且是等效的,如果推断为值类型,则也是等效的。
}
}