> 백엔드 개발 > C#.Net 튜토리얼 > C#에서 ==, Equals(), ReferenceEquals()의 차이점을 한번에 이해해보세요

C#에서 ==, Equals(), ReferenceEquals()의 차이점을 한번에 이해해보세요

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

먼저 CLR의 기본 값 유형 간의 비교를 살펴보고 먼저 코드를 살펴보세요.

            int age1 = 30;            int age2 = 30;

            Console.WriteLine("int == int: {0}", age1 == age2);
            Console.WriteLine("int == int: {0}", age2 == age1);
            Console.WriteLine("int Equals int: {0}", age1.Equals(age2));
            Console.WriteLine("int Equals int: {0}", age2.Equals(age1));
            Console.WriteLine("int ReferenceEquals int: {0}", object.ReferenceEquals(age1, age2));
            Console.WriteLine("int ReferenceEquals int: {0}", object.ReferenceEquals(age2, age1));

            Console.ReadLine();
로그인 후 복사

실행 결과:

C#에서 ==, Equals(), ReferenceEquals()의 차이점을 한번에 이해해보세요

동일한 기본 값 유형(위 예제 코드에서는 둘 다 int임)의 경우 == 및 Equals()의 비교 결과는 동일합니다. ReferenceEquals()는 두 객체의 참조가 동일한지 여부를 결정하므로 값 유형의 경우 반드시 boxing 작업은 매번 임시 개체를 생성하므로 항상 false를 반환합니다. 다음으로 코드의 age2 유형을 바이트 유형으로 변경합니다. 비교 결과는 어떻게 되나요? 실행 결과를 살펴보세요.

C#에서 ==, Equals(), ReferenceEquals()의 차이점을 한번에 이해해보세요

이제 age1.Equals(age2)와 age2.Equals(age1)의 결과가 다르다는 것을 알 수 있습니다. 기본 값 유형 비교에서 ==는 "값"의 내용을 비교합니다. 두 개체의 "값"이 동일하면 두 개체는 "=="이지만 Equals()는 조금 더 많은 작업을 수행합니다. 즉, Equal()에는 실제로 "암시적 변환" 프로세스가 있습니다. 이는 위 코드의 age1.Equals(age2)가 int.Equals(int)와 동일하며 바이트 데이터가 암시적으로 Int 유형 데이터로 변환될 수 있음을 의미합니다. 이므로 age1.Equals(age2)의 결과는 true이고 age2.Equals(age1)은 byte.Equals(byte)와 동일하지만 int 유형 데이터는 손실 가능성이 있으므로 암시적으로 byte 유형으로 변환할 수 없습니다. 데이터 정밀도. 실제로 age2.Equals(age1)의 Equals()는 다음 코드와 유사해야 합니다.

        public override bool Equals(object obj)
        {            if (!(obj is Byte))
            {                return false;
            }            return m_value == ((Byte)obj).m_value;
        }
로그인 후 복사

명시적 변환인 경우 age2.Equals((byte)age1)의 결과는 다음과 같습니다. 이때는 사실일 것이다.

문자열 유형 간의 비교에 대해 이야기해 보겠습니다. 문자열은 "불변"이기 때문에 특별한 참조 유형입니다. 먼저 코드를 살펴보겠습니다.

            string name1 = "Jack";            string name2 = "Jack";            object o1 = name1;            object o2 = name2;

            Console.WriteLine("name1 == name2: {0}", name1 == name2);
            Console.WriteLine("name1 Equals name2: {0}", name1.Equals(name2));

            Console.WriteLine("o1 == o2: {0}", o1 == o2);
            Console.WriteLine("o1 Equals o2: {0}", o1.Equals(o2));

            Console.WriteLine("o1 == name2: {0}", o1 == name2);
            Console.WriteLine("o1 Equals name2: {0}", o1.Equals(name2));

            Console.WriteLine("name1 ReferenceEquals name2: {0}", object.ReferenceEquals(name1, name2));
            Console.WriteLine("o1 ReferenceEquals o2: {0}", object.ReferenceEquals(o1, o2));

            Console.ReadLine();
로그인 후 복사

위 코드 실행 결과:

C#에서 ==, Equals(), ReferenceEquals()의 차이점을 한번에 이해해보세요

이제 하나씩 설명하겠습니다. 하나씩. 어떤 사람들은 name1과 name2가 모두 "Jack"을 저장하므로 name1과 name2는 실제로 동일한 객체이므로 name1==name2와 name1.Equals(name2)의 비교 결과가 동일하다고 말할 것입니다. .NET Reflector 도구를 통해 문자열의 소스 코드를 보면 다음 코드 조각을 볼 수 있습니다.

C#에서 ==, Equals(), ReferenceEquals()의 차이점을 한번에 이해해보세요

연산자 ==는 실제로 Equals()를 반환합니다. 그래서 왜 name1==name2와 name1.Equals(name2)의 비교 결과가 같은지에 대한 설명은 "name1과 name2는 실제로는 같은 객체입니다"보다 이 설명이 더 직관적이라고 생각합니다.

우리는 문자열 유형의 특수성으로 인해 CLR이 문자열 객체를 통해 여러 개의 동일한 문자열 내용을 공유할 수 있다는 것을 알고 있습니다. 따라서 위의 name1과 name2는 동일한 위치를 가리키고 다음의 o1 == o2 , o1 == name2, object.ReferenceEquals(name1, name2)의 비교 결과는 모두 true이므로 이 명령문도 확인됩니다(실제로 object.ReferenceEquals(name1, o2)도 true입니다). 그런데 name1과 name2의 할당이 이렇게 된다면 어떻게 될까요?

            string name1 = new string(new char[] { 'J', 'a', 'c', 'k' });
            string name2 = new string(new char[] { 'J', 'a', 'c', 'k' });
로그인 후 복사

실행 결과 보기:

C#에서 ==, Equals(), ReferenceEquals()의 차이점을 한번에 이해해보세요

name1==name2와 name1.Equals(name2)의 비교 결과는 이해하기 쉽습니다. , 위에서 언급한 대로 예, == 연산자는 실제로 Equals()(참조 유형의 경우 Equals()가 관리되는 힙에 저장된 내용을 비교함)를 반환하므로 두 결과는 동일합니다. 그러나 객체 객체 o1과 o2를 비교할 때 o1 == o2와 o1.Equals(o2)의 결과는 다릅니다. == 객체 객체는 유형 객체 포인터를 비교합니다. o1과 o2는 두 객체이며 해당 유형 객체 포인터는 서로 달라야 합니다. Equals()는 관리되는 힙에 저장된 o1과 o2의 내용을 비교하므로 o1.Equals(o2)는 다음과 같습니다. 진실. 이는 또한 다음 o1 == name2가 false이고 o1.Equals(name2)가 true임을 보여줍니다.

먼저 object.ReferenceEquals 내부의 코드를 살펴보겠습니다.

C#에서 ==, Equals(), ReferenceEquals()의 차이점을 한번에 이해해보세요

이제 object.ReferenceEquals(name1, name2) 및 object.ReferenceEquals(o1)에 대한 내용입니다. , o2 ) 결과는 모두 거짓입니다. 실제로는 두 개체 간의 == 문제입니다.

마지막으로 사용자 정의 참조 유형 비교에 대해 이야기하겠습니다.

    class MyName
    {
        private string _id;
        public string Id
        {
            get { return _id; }
            set { _id = value; }
        }

        public MyName(string id)
        {
            this.Id = id;
        }
    }
로그인 후 복사

위의 name1 및 name2 선언을 다음과 같이 변경합니다.

            MyName name1 = new MyName("12");
            MyName name2 = new MyName("12");
로그인 후 복사

다른 사항은 변경되지 않고 그대로 유지되며 실행 결과는 다음과 같습니다.

C#에서 ==, Equals(), ReferenceEquals()의 차이점을 한번에 이해해보세요

name1과 name2는 완전히 다른 객체입니다. 비교 결과가 모두 거짓이라는 것을 이해하기 쉽습니다.




C#의 ==, Equals() 및 ReferenceEquals를 한 번에 이해하기 관련 기사 ()의 차이점은 PHP 중국어 홈페이지를 주목해주세요!


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