집 >백엔드 개발 >C#.Net 튜토리얼 >Equals, ReferenceEquals,==의 차이점
.net에는 같음을 비교하는 여러 가지 방법이 있습니다.
객체의 정적 참조Equals()
객체의 정적 Equals()
objectEquals()의 예
연산자==
다음은 차이점과 사용법을 소개합니다.
ReferenceEquals
ReferenceEquals는 참조 유형의 참조가 동일한 객체를 가리키는지 여부를 비교하는 데 사용됩니다. 참조 유형만 비교할 수 있습니다. 값 유형이 전달되면 항상 false가 반환됩니다. 왜냐하면 값 유형이 매개변수로 사용될 때 먼저 boxing되기 때문입니다. boxed 값 유형이 같음을 참조하더라도 여전히 두 개의 다른 개체이므로 변수는 다음을 가리킵니다. 다른 객체이므로 항상 false를 반환합니다.
int x = 10;
int y = 10;
bool b1 = object.ReferenceEquals(x,y)
여기의 결과는 확실히 false를 반환하지만 비교하는 경우 참조 유형 , 두 참조가 동일한 객체를 가리키는 경우 true입니다.
여전히 엔터티 클래스를 먼저 정의합니다.
public class Person
{
private int _personId;
public int PersonId
{
get { return _personId; }
set { _personId = value; }
}
비공개 문자열 _firstName;
공개 문자열 FirstName
{
get { return _firstName; }
set { _firstName = value; }
}
비공개 문자열 _lastName;
공개 문자열 LastName
{
get { return _lastName }
set { _lastName = value; }
}
public Person() { }
public Person(int personId, string firstName, string lastName)
{
this. _personId = personId;
this._firstName = firstName;
this._lastName = lastName;
}
}
호출 코드
Person person1 = new Person(1," Edrick ","Liu");
사람 person2 = new Person(2, "Meci", "Luo");
사람 person3 = 사람2;
bool br1= object.ReferenceEquals(person1,person2) ;
bool br2 = object.ReferenceEquals(person2, person3)
첫 번째는 false를 반환하고 두 번째는 true를 반환하는 것을 확인할 수 있습니다. 그렇다면 객체 중 하나가 null이거나 두 객체 모두 null이면 어떻게 될까요? 결과는 false입니다. 둘 다 null이면 어떻게 되나요? 결과는 사실입니다. 그들은 예외를 던지지 않습니다.
Instance Equals
Instance Equals는 상대적으로 복잡한 비교 방법입니다. Equals 인스턴스는 참조가 동일한 개체를 가리키는지 여부를 비교할 수 있으며 개체를 값별로 비교할 수 있습니다. 객체를 값으로 비교하려면 Equals 객체를 오버로드하여 비교 논리를 구현해야 합니다. 동시에 Equals는 기본적으로 비교 값 유형의 동일성을 지원합니다. 그렇다면 객체가 값 동등 비교를 할 수 있도록 Equals를 오버로드하려면 어떻게 해야 할까요?
MSDN에는 몇 가지 지침이 나열되어 있습니다.
부동 소수점 유형과 관련된 경우를 제외하고 x.Equals(x)는 true를 반환합니다.
x.Equals(y)는 y.Equals(x)와 동일한 값을 반환합니다.
x.Equals(y)는 x와 y가 모두 NaN인 경우 true를 반환합니다.
(x.Equals(y) && y.Equals(z))는 x.Equals(z)가 true를 반환하는 경우에만 true를 반환합니다.
x.Equals(y)에 대한 연속 호출은 x 및 y에서 참조하는 객체가 수정되지 않는 한 동일한 값을 반환합니다.
x.Equals(nullNothingnullptrnull 참조(Visual Basic의 경우 Nothing))는 false를 반환합니다.
다시 작성된 코드를 살펴보겠습니다
public class Person
{
private int _personId;
public int PersonId
{
get { return _personId; }
set { _personId = value; }
}
private string _firstName;
public string FirstName
{
get { return _firstName ; }
set { _firstName = value; }
}
private string _lastName;
public string LastName
{
get { return _lastName } > set { _lastName = value; }
}
{
this ._personId = personId;
this._firstName = firstName;
}
public override bool Equals(object obj)
obj != null && obj는 사람입니다)
{
Person p = obj as Person;
return (PersonId == p.PersonId) && (FirstName == p.FirstName) && (LastName = = p.LastName);
{
return false
}
}
공개 재정의 int GetHashCode()
{
}
}
호출 코드
Person person1 = new Person(1,"Edrick","Liu"); Person person2 = new Person(2, "Meci", "Luo");
Person person3 = person2
Console.WriteLine(person4.Equals(person1));
Console.WriteLine(person4.Equals(person2))
결과를 보면 첫 번째는 true이고 두 번째는 false입니다. 다시 로드하는 동안 예외가 발생해서는 안 됩니다. 그렇다면 Person을 상속하는 클래스가 있는 경우 파생 클래스를 어떻게 비교합니까?
public class Student:Person
{
private int _studentNumber;
public int StudentNumber
{
get { return _studentNumber; }
set { _studentNumber = 값; }
}
public Student() { }
public Student(int personId, string firstName, string lastName, int StudentNumber)
{
this.PersonId = personId ;
this.FirstName = 이름;
this.LastName = 성;
this._studentNumber = 학생번호;
}
public override bool Equals(object obj)
{
if (obj != null && obj is Person)
{
Student s = obj as Student;
base.Equals(obj)&&StudentNumber==s.StudentNumber;를 반환합니다.
}
else
{
false를 반환합니다.
}
}
공개 재정의 int GetHashCode()
{
return base.GetHashCode()^StudentNumber;
}
}
调用代码
학생 s1 = new Student(1, "Edrick", "Liu", 1);
학생 s2 = 신규 학생(2, "메시", "루오", 2);
학생 s3 = new Student(1, "Edrick", "Liu", 1);
Console.WriteLine(s1.Equals(s2));
Console.WriteLine(s1.Equals(s3));
저희는 Equals 방법과 새로운 Equals 방법을 사용하고 있습니다.
Equals
사용 방법은 다음과 같습니다.了。这个방법은 也是静态的,它能比较引用,能比较值类型。如果比较的类型重载了实例的类型它也能也比较对象的值。所以它返回true有三种情况。
1,引用指向同一个对象
2,比较两个null
3, 重载了Equals的实例方法返回true
학생 s1 = 새 학생(1, "Edrick", "리우", 1);
학생 s2 = 신규 학생(2, "메시", "루오", 2);
학생 s3 = 새 학생(1, "Edrick", "Liu", 1);
학생 s4 = s3;
Console.WriteLine(object.Equals(s1,s3));
Console.WriteLine(object.Equals(s4, s3));
这两个島为true,这里静态的 Equals跟静态的 EqualsReference有一个区别,静态的Equals如果有一个参数为null会抛流异常。
下면讨论一个有趣的现象,如果loader s1 = new Student(1, "Edrick", "Liu", 1);
학생 s2 = 신규 학생(2, "메시", "루오", 2);학생 s3 = new Student(1, "Edrick", "Liu", 1);
학생 s4 = s3;
Console.WriteLine(s1==s3);
第一个为false,第二个为true.符们我们의 뜻 ,也能确保는 使是候,代码能按候,代码能按光我们的心图工比。因为集工比较的是对象的值那么最后代码还是不能按 사진이 당신의 즐거운 여행입니다.
==运算符
==号运算符其实跟实例的Equals没多大多区别,==是运算符,而Equals是방법 。他们道可以重写。默认道能比较引用및比较值。关于==적중载可以参考运算符一文中的运算符载。
总结他们的区别:
ReferenceEquals :静态방법,不能重写,只能比较引用,如果有一个参数为null会返回false,不会抛take异常,如果比较值类型,则始终返回false。
같음:实例방법,默认可以比较引用也可以比较值,可以重写。可以按值比较对象。
静态Equals:静态方法,不能重写。如果没多写Equals,比较引用,或者比较值。如果중载了Equals방법입니다.比较引用,或者比较值,或者按较写的Equals比较,如果其中一个参数为null,抛take异常
==运算符:可以按引用比较,也可以按值比较。可以重写。是操work运算符。
最后需要的是,如果重载了Equals,则最好是载GetHashCode,必须载==运算符。
更多Equals,ReferenceEquals,==적区别상关文章请关注PHP中文网!