1.我们使用Object的ReferenceEquals方法来判断两个实列是否时相同的对象
class Program
{
static void Main(string[] args)
{
Person p1 = new Person();
p1.Age = 12;
p1.Name = "wabc";
Person p2 = new Person();
p2.Name = "13";
p2.Age = 12;
Person p3 = p1;
Console.WriteLine(object.ReferenceEquals(p1,p2));
Console.WriteLine(object.ReferenceEquals(p1,p3));
Console.WriteLine(object.ReferenceEquals(p2,p3));
Console.ReadKey();
}
}
class Person
{
public string Name { get;set;}
public int Age { get; set; }
}
因为p2是创建的新的Person对象,和p1指向的对象是不同的对象,所以为False,但是Person p3 =p1;只是复制了一份引用,和p1指向同一个对象,所以为True,p2与p3是同样的原理。
下面我们来研究一下字符串的Equals方法
string s1 = "testcode";
string s2 = s1;
string s3 = new string(new char[] { 't','e','s','t','c','o','d','e'});
Console.WriteLine(s1.Equals(s2));
Console.WriteLine(s1.Equals(s3));
Console.WriteLine(s2.Equals(s3));
为什么全是True呢?
我们进行反编译或者VSF12转到定义发现,string类重写了Equals方法。
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail), __DynamicallyInvokable]
public bool Equals(string value)
{
if (this == null)
{
throw new NullReferenceException();
}
if (value == null)
{
return false;
}
if (this == value)
{
return true;
}
if (this.Length != value.Length)
{
return false;
}
return EqualsHelper(this, value);
}
上述代码是反编译出来的代码,在string类的Equals方法中只要两个字符串的值相等,就返回True,否则返回false.
下面我们也来重写一下我们Person类的Equals方法。
public static bool operator ==( Person left ,Person right)
{
return left.Name ==right.Name && left.Age == right.Age;
}
public static bool operator !=(Person left, Person right)
{
return !left.Equals(right);
}
}
然后我们来测试一样我们能否像字符串那样用==来判断两个对象是否相等
Console.WriteLine(p1==p2);
Console.WriteLine(p1==p3);
Console.WriteLine(p2==p3);
默认情况下==不是调用Equals方法,需要重载==运算符;
String等这些类是重写了Equals方法。
面试题:下面的代码有几个字符串对象
String s1 = "abc";
string s2 = s1;
string s3 = new String(new char[] {'a','b','c' });
Console.WriteLine(s1==s3);//输出true(虽然这里s1和s3不是同一个对象,但由于string重写了Equals方法,只要内容相等也返回true)
答案:两个字符串对象
---本博客是学习以后记录知识,如有侵权,请联系删除!!!