同一和相等 所谓的同一指的是两个对象如果引用的是同一个实例,那么我们就说这两个对象具有同一性。在 C# 中我们可以利用 object 类或者它的派生类中的 ReferenceEquals 静态方法来判断对象之间的同一性。但是同一只是相等的一种,因为在某些情况下两个对象的部分值或者全部值相等但引用不同,我们也可以说它们具有相等性。下面我们来看一个例子,这个例子通过重写相等性来实现两个对象的相等性。

class Program

{

static void Main(string[] args)

{

Student s1 = new Student

{

Age = 12,

Id = 1,

Name = “小明”

};

Student s2 = new Student

{

Age = 13,

Id = 1,

Name = “小明”

};

if (Student.ReferenceEquals(s1, s2))

{

Console.WriteLine(“是同一个学生”);

}

else

{

Console.WriteLine(“不是同一个学生”);

}

Console.Read();

}

}

class Student

{

public int Id { get; set; }

public string Name { get; set; }

public int Age { get; set; }

public static bool ReferenceEquals(Student s1, Student s2)

{

if (s1.Equals(s2) ||

object.ReferenceEquals(s1, s2) ||

s1.Id==s2.Id

s1==s2)

{

return true;

}

else

{

return false;

}

}

}

从上述代码中我们可以看出,虽然 s1 和 s2 引用是不相等的,但是这两个对象使用了相同的 Id ,因此我们认为 Id 相同的学生就是同一个学生。这么做可以确保数据库中不会出现重复的录入。

Tip:只有引用类型才会可能出现引用相等的情况,对于值类型来说调用 ReferenceEquals 方法永远返回的是 false ,因为值类型转换成 object 时是需要装箱的,即是传递的两个参数是同一个值,也会返回 false 。