首页 > 代码库 > Equals和==比較
Equals和==比較
总结一下:
对于字符串来说。两个比較的都是对象的值,而且是等效的,这是由于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;==比較的是对象的引用。 //对于判断类型(弱化类型、隐式类型)。假设编译器判断为引用类型,则两个比較的都是对象的引用。而且是等效的。假设判断为值类型。则也是等效的。 } }
Equals和==比較
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。