> 백엔드 개발 > C#.Net 튜토리얼 > Equals, ReferenceEquals,==의 차이점

Equals, ReferenceEquals,==의 차이점

高洛峰
풀어 주다: 2016-12-16 09:53:01
원래의
1085명이 탐색했습니다.

.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; }
}

public Person() { }

public Person(int personId, string firstName, string lastName)

{
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);

else

{
return false
}
}

공개 재정의 int GetHashCode()
{

return base.GetHashCode()^PersonId;

}
}
호출 코드

Person person1 = new Person(1,"Edrick","Liu"); Person person2 = new Person(2, "Meci", "Luo");
Person person3 = person2

Person person4 = new Person(1, "Edrick", "Liu");


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); 

Console.WriteLine(s3==s4); 

第一个为false,第二个为true.符们我们의 뜻 ,也能确保는 使是候,代码能按候,代码能按光我们的心图工比。因为集工比较的是对象的值那么最后代码还是不能按 사진이 당신의 즐거운 여행입니다.

==运算符

==号运算符其实跟实例的Equals没多大多区别,==是运算符,而Equals是방법 。他们道可以重写。默认道能比较引用및比较值。关于==적중载可以参考运算符一文中的运算符载。

总结他们的区别:

ReferenceEquals :静态방법,不能重写,只能比较引用,如果有一个参数为null会返回false,不会抛take异常,如果比较值类型,则始终返回false。

같음:实例방법,默认可以比较引用也可以比较值,可以重写。可以按值比较对象。

静态Equals:静态方法,不能重写。如果没多写Equals,比较引用,或者比较值。如果중载了Equals방법입니다.比较引用,或者比较值,或者按较写的Equals比较,如果其中一个参数为null,抛take异常

==运算符:可以按引用比较,也可以按值比较。可以重写。是操work运算符。

最后需要的是,如果重载了Equals,则最好是载GetHashCode,必须载==运算符。




更多Equals,ReferenceEquals,==적区别상关文章请关注PHP中文网!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿