//区分 == 和 Equals 在比较方面的区别探究
//通常 == 比较的是两个的内容是否相等
//通常 Equals 比较的是两个地址是否相等
//分三种,值类型,引用类型,以及特殊的字符串类型
public class ComparisonSymbol
{
//区分 == 和 Equals 在比较方面的区别探究
//通常 == 比较的是两个的内存地址是否相等
//通常 Equals 比较的是两个的内容是否 //分三种,值类型,自定义引用类型,以及字符串类型 public void Main()
{
//下面是值的比较,C#重构了 ==
int num1 = 10;
int num2 = 10;
var pin = GCHandle.ToIntPtr(GCHandle.Alloc(num1));
Console.WriteLine("num1 的栈地址 = {0}",pin);
pin = GCHandle.ToIntPtr(GCHandle.Alloc(num2));
Console.WriteLine("num2 的栈地址 = {0}",pin);
Console.WriteLine("(num1 == num2) = {0}",(num1 == num2));
Console.WriteLine("num1.Equals(num2) = {0}",num1.Equals(num2));
//下面是字符串的比较,C#重构了 ==
string a = new string("hello");
string b = new string("hello");
pin = GCHandle.ToIntPtr(GCHandle.Alloc(a));
Console.WriteLine("a 的栈地址 = {0}",pin);
pin = GCHandle.ToIntPtr(GCHandle.Alloc(b));
Console.WriteLine("b 的栈地址 = {0}",pin);
Console.WriteLine("(a == b) = {0}",(a == b));
Console.WriteLine("a.Equals(b) = {0}",a.Equals(b));
string c = a;
string d = b;
pin = GCHandle.ToIntPtr(GCHandle.Alloc(c));
Console.WriteLine("c 的栈地址 = {0}",pin);
pin = GCHandle.ToIntPtr(GCHandle.Alloc(d));
Console.WriteLine("d 的栈地址 = {0}",pin);
Console.WriteLine("(c == d) = {0}",(c == d));
Console.WriteLine("c.Equals(d) = {0}",c.Equals(d));
//下面是引用类型中的类相关,引用类型的 == 需要自己重载
MyClass v1 = new MyClass();
MyClass v2 = new MyClass();
pin = GCHandle.ToIntPtr(GCHandle.Alloc(v1));
Console.WriteLine("v1 的栈地址 = {0}",pin);
pin = GCHandle.ToIntPtr(GCHandle.Alloc(v2));
Console.WriteLine("v2 的栈地址 = {0}",pin);
Console.WriteLine("(v1 == v2) = {0}",(v1 == v2));
Console.WriteLine("v1.Equals(v2) = {0}",v1.Equals(v2));
}
}
public class MyClass
{
}
输出结果:
a 的栈地址 = 2271904272776
b 的栈地址 = 2271904272768
(a == b) = True
a.Equals(b) = True
c 的栈地址 = 2271904272760
d 的栈地址 = 2271904272752
(c == d) = True
c.Equals(d) = True
v1 的栈地址 = 2271904272744
v2 的栈地址 = 2271904272736
(v1 == v2) = False
v1.Equals(v2) = False
上面三种结果都体现不了前面提到理论,所以在C#体系,仅供理解。
浙公网安备 33010602011771号