C#语言中,对于变量相等的判断有4中形式,2个静态的object类的方法:ReferenceEquals(obj1,boj2)和Equals(obj1,obj2),还有实例方法Equals(),以及重载运算符号==。
(1)ReferenceEquals,看名字就知道比较的是2个变量的引用类型,所以很显然2个值类型永远都会返回false,就算是值类型变量自身相比,也返回false(涉及到装箱);
(2)静态Equals,反编译dll可以看到Equals方法实际调用的是第一个变量的实例方法Equals,所以它的返回值取决于变量类型的Equals方法。
(3)实例Equals方法,默认比较的是“引用相等”。不过对于System.ValueType重写了此方法,所以值类型不再按“引用相等”来比较。对于值类型,最好重写Equals方法;System.String类也重写了Equals,所以2个字符串内容相同将返回True.
(4)重载运算符==,同实例方法Equals,默认比较的也是“引用相等”,但ValueType和String也分别做了重写。
在console项目中测试如下:
static void Main(string[] args)
{
int i = 1;
int j = 1;
myData md1 = new myData("aaa");
myData md2 = new myData("bbb");
myData md3 = md1;
//test referenceEquals
Console.WriteLine(object.ReferenceEquals(i, j));
Console.WriteLine(object.ReferenceEquals(i, i));
Console.WriteLine(object.ReferenceEquals(md1, md2));
Console.WriteLine(object.ReferenceEquals(md1, md3));
//test static Equals
Console.WriteLine(object.Equals(i, j));
Console.WriteLine(object.Equals(md1, md2));
Console.WriteLine(object.Equals(md1, md3));
//test Equals
Console.WriteLine(i.Equals(j));
Console.WriteLine(md1.Equals(md3));
//test ==
Console.WriteLine(i == j);
Console.WriteLine(md1 == md3);
}
public class myData
{
string _str = string.Empty;
public myData(string str)
{
_str = str;
}
}
运行结果如下:
转载于:https://www.cnblogs.com/JasonCrab/archive/2009/06/23/1508766.html