C#기초: Equals()와 연산자==의 차이점 분석

4181 단어
값 유형에 대해 객체의 값이 같으면 같은 연산자(==)는 true를 반환하고 그렇지 않으면false를 반환합니다.string 이외의 인용 형식에 대해 두 대상이 같은 대상을 인용하면 ==true로 되돌아옵니다.string 형식에 대해 ==는 문자열의 값을 비교합니다. ==조작이 비교되는 것은 두 변수의 값이 같은지 여부다.
equals () 방법은 두 대상의 내용이 일치하는지 비교하는 것입니다. equals는 인용 유형이 같은 대상에 대한 인용인지 비교하는 것입니다.값 유형에 대한 비교는 여기서 설명하지 않겠습니다. 다음은 인용 유형에 대한 비교입니다.
일단 저희가 프로그램을 한번 볼게요.
 
  
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
    class Person
    {
        private string name;
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        public Person(string name)
        {
            this.name = name;
        }
    }
}
 
  
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string a = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });
            string b = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });
            Console.WriteLine(a == b);
            Console.WriteLine(a.Equals(b));
            object g = a;
            object h = b;
            Console.WriteLine(g == h);
            Console.WriteLine(g.Equals(h));
            Person p1 = new Person("jia");
            Person p2 = new Person("jia");
            Console.WriteLine(p1 == p2);
            Console.WriteLine(p1.Equals(p2));
            Person p3 = new Person("jia");
            Person p4 = p3;
            Console.WriteLine(p3 == p4);
            Console.WriteLine(p3.Equals(p4));
            Console.ReadLine();
        }
    }
}

프로그램을 실행하면 무엇을 출력합니까?정답은true,true,false,true,false,false,true,true입니다.
왜 이 답이 나왔을까요?값 유형은 메모리에 저장된 창고(이후 창고라고 약칭)이기 때문에 인용 유형의 변수는 창고에 인용 유형의 변수의 주소만 저장하고 그 자체는 창고에 저장한다.
== 작업은 두 변수의 값이 같은지, 인용형 변수는 두 변수가 더미에 저장된 주소가 같은지, 즉 창고의 내용이 같은지를 비교한다.
equals 조작은 두 변수가 같은 대상에 대한 인용인지, 즉 무더기의 내용이 같은지 여부를 나타낸다.
문자열은 특수한 인용형 유형으로 C# 언어에서string 대상을 다시 불러오는 많은 방법(equals() 방법 포함)을 사용하여string 대상을 마치 값 유형처럼 사용할 수 있다.
따라서 위의 예에서 문자열 a와 문자열 b의 두 비교는 같다.
object g와 object h의 메모리에 있는 두 개의 다른 대상은 창고의 내용이 같지 않기 때문에 같지 않습니다.g.equals(h)는 sting의 equals() 방법을 사용하기 때문에 같다(너무 많다).문자열 a와 b를 이렇게 수정하는 경우
        string a="aa";
        string b="aa";
g와 h의 두 비교는 모두 같다.이것은 시스템이 문자열 b에 메모리를 분배하지 않았기 때문에 'aa' 를 b로 가리켰기 때문이다.그래서 a와 b는 같은 문자열을 가리킨다.
p1과 p2는 메모리에 있는 두 개의 다른 대상이기 때문에 메모리에 있는 주소가 틀림없이 같지 않기 때문에 p1==p2는false로 되돌아갈 것이다. 또한 p1과 p2는 서로 다른 대상에 대한 인용이기 때문에 p1이다.equals(p2)는false를 반환합니다.
p3과 p4, p4=p3에 대해 p3은 대상에 대한 인용을 p4에 부여했고 p3과 p4는 같은 대상에 대한 인용이기 때문에 두 비교 모두true로 되돌아간다.
만약 우리가 person의 equals 방법을 다시 쓴다면:
 
  
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
    class Person
    {
        private string name;
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        public Person(string name)
        {
            this.name = name;
        }
        public override bool Equals(object obj)
        {
            if (!(obj is Person))
                return false;
            Person per = (Person)obj;
            return this.Name == per.Name;
        }
    }
}

그럼equals(p2),true로 돌아갑니다.

좋은 웹페이지 즐겨찾기