本文旨在把C#中的 ==、Equals、ReferenceEquals 三种比较方法整的明明白白。
一、==操作符可以用于比较两个对象
1、值类型的比较,比较数值的大小,不同类型时也可比较。
(1)同种类型
新建控制台应用程序
static void Main(string[] args)
{
Console.Title = "C#的等于";
int v1 = 1;
int v2 = 1;
Console.WriteLine("值类型同类型的比较:" + (v1 == v2).ToString());
Console.ReadKey();
}
运行结果:
(2)不同类型
static void Main(string[] args)
{
Console.Title = "C#的等于";
int v3 = 1;
double d3 = 1;
Console.WriteLine("值类型不同类型的比较:" + (v3 == d3).ToString());
Console.ReadKey();
}
运行结果:
2、引用类型的比较,比较对象的引用地址是否一致,但是string类型较特殊,比较字符串内容是否相等。
(1)一般引用类型
添加Students类
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
}
修改Main方法
static void Main(string[] args)
{
Console.Title = "C#的等于";
Student student1 = new Student()
{
Id = 1,
Name = "qqq"
};
Student student2 = new Student()
{
Id = 1,
Name = "qqq"
};
Console.WriteLine("引用类型的比较new的对象:" + (student1 == student2).ToString());
Student student3 = student1;
Console.WriteLine("引用类型的比较赋值的对象:" + (student1 == student3).ToString());
Console.ReadKey();
}
运行效果:
(2)string类型使用==比较时,比较的是string字符串是否相同,但两个比较的字符串引用地址不一定相同。
static void Main(string[] args)
{
Console.Title = "C#的等于";
string str1 = "hello";
string str2 = "hello";
string str3 = "he";
string str4 = "llo";
string str5 = str3 + str4;
Console.WriteLine("str1==str2结果:" + (str1 == str2).ToString());
Console.WriteLine("str1==str5结果:" + (str1 == str5).ToString());
Console.WriteLine("str1、str2引用地址比较结果:" + object.ReferenceEquals(str1,str2).ToString());
Console.WriteLine("str1、str5引用地址比较结果:" + object.ReferenceEquals(str1,str5).ToString());
Console.ReadKey();
}
运行结果:
二、Equals方法比较两个对象
1、值类型的比较
(1)相同类型的值类型,比较值的大小
static void Main(string[] args)
{
Console.Title = "C#的等于";
int v1 = 1;
int v2 = 1;
Console.WriteLine("相同类型的值类型Equals比较:" + v1.Equals(v2));
Console.ReadKey();
}
运行结果:
(2)不同类型的值类型,Equals后的值类型可以隐式转换为Equals前的值类型,则数值相等时返回true,反之数值相等时返回false
static void Main(string[] args)
{
Console.Title = "C#的等于";
int v1 = 1;
double v2 = 1;
short v3 = 1;
Console.WriteLine("不同类型的值类型Equals比较:" + v1.Equals(v2));
Console.WriteLine("不同类型的值类型Equals比较,int类型隐式转换为double:" + v2.Equals(v1));
Console.WriteLine("不同类型的值类型Equals比较,short类型隐式转换为int:" + v1.Equals(v3));
Console.ReadKey();
}
运行结果:
2、引用类型的比较。
(1)一般引用类型,Equals比较的是引用类型的地址
static void Main(string[] args)
{
Console.Title = "C#的等于";
Student student1 = new Student()
{
Id = 1,
Name = "qqq"
};
Student student2 = new Student()
{
Id = 1,
Name = "qqq"
};
Console.WriteLine("Equals比较引用类型new对象"+student1.Equals(student2));
Student student3 = student1;
Console.WriteLine("Equals比较引用类型赋值对象" + student1.Equals(student3));
Console.ReadKey();
}
运行结果:
(2)Equals比较string类型。比较string类型的字符串内容是否相同,字符串内容相同引用地址不同的字符串Equals方法返回True。
static void Main(string[] args)
{
Console.Title = "C#的等于";
string str1 = "hello";
string str2 = "hello";
string str3 = "he";
string str4 = "llo";
string str5 = str3 + str4;
Console.WriteLine("Equals比较string类型str1、str2" + str1.Equals(str2));
Console.WriteLine("Equals比较string类型str1、str5" + str1.Equals(str5));
Console.WriteLine("比较string类型str1、str2的引用地址" + object.ReferenceEquals(str1,str2));
Console.WriteLine("比较string类型str1、str5的引用地址" + object.ReferenceEquals(str1, str5));
Console.ReadKey();
}
运行结果:
三、ReferenceEquals 比较两个对象
1、ReferenceEquals比较值类型,值类型的引用地址都不相同
static void Main(string[] args)
{
Console.Title = "C#的等于";
int v1 = 1;
int v2 = 1;
int v3 = v1;
double v4 = 1;
Console.WriteLine("同类型的值类型引用地址:" + object.ReferenceEquals(v1, v2));
Console.WriteLine("同类型的值类型复制后引用地址:" + object.ReferenceEquals(v1, v3));
Console.WriteLine("不同类型的值类型引用地址:" + object.ReferenceEquals(v1, v4));
Console.ReadKey();
}
运行结果:
2、ReferenceEquals比较引用类型,比较的是引用类型对象的引用地址是否相同。
(1)一般定义的对象,比较的是对象的引用地址
static void Main(string[] args)
{
Console.Title = "C#的等于";
Student student1 = new Student()
{
Id = 1,
Name = "qqq"
};
Student student2 = new Student()
{
Id = 1,
Name = "qqq"
};
Console.WriteLine("引用类型的比较new的对象:" + object.ReferenceEquals(student1,student2));
Student student3 = student1;
Console.WriteLine("引用类型的比较赋值的对象:" + object.ReferenceEquals(student1, student3));
Console.ReadKey();
}
运行结果:
(2)ReferenceEquals比较string类型,比较的是字符串的地址。
static void Main(string[] args)
{
Console.Title = "C#的等于";
string str1 = "hello";
string str2 = "hello";
string str3 = "he";
string str4 = "llo";
string str5 = str3 + str4;
Console.WriteLine("ReferenceEquals比较str1、str2:" + object.ReferenceEquals(str1, str2));
Console.WriteLine("ReferenceEquals比较str1、str5:" + object.ReferenceEquals(str1, str5));
Console.ReadKey();
}
运行结果:



