다음을 통해 공유


같음 연산자 - 두 개체가 같은지 여부를 테스트합니다.

==(같음)!=(같지 않음) 연산자는 피연산자가 같은지 여부를 확인합니다. 값 형식은 내용이 같을 때 같습니다. 참조 형식은 두 변수가 동일한 스토리지를 참조할 때 같습니다.

C# 언어 참조는 가장 최근에 릴리스된 C# 언어 버전을 문서화합니다. 또한 예정된 언어 릴리스의 공개 미리 보기 기능에 대한 초기 설명서도 포함되어 있습니다.

설명서는 언어의 마지막 세 버전 또는 현재 공개 미리 보기에서 처음 도입된 기능을 식별합니다.

팁 (조언)

C#에서 기능이 처음 도입된 시기를 찾으려면 C# 언어 버전 기록에 대한 문서를 참조하세요.

is== 대해 테스트할 때 테스트 대신 패턴 일치 연산자를 사용할 수 있습니다. 연산자는 is 모든 값 및 참조 형식에 대해 기본 같음 의미 체계를 사용합니다.

같음 연산자 ==

같음 연산자 ==는 피연산자가 같으면 true를 반환하고, 그렇지 않으면 false를 반환합니다.

값 형식 같음

기본 제공 값 형식의 피연산자는 해당 값이 같은 경우 동일합니다.

int a = 1 + 2 + 3;
int b = 6;
Console.WriteLine(a == b);  // output: True

char c1 = 'a';
char c2 = 'A';
Console.WriteLine(c1 == c2);  // output: False
Console.WriteLine(c1 == char.ToLower(c2));  // output: True

참고

==산자가 <숫자(>또는<=)가 아니면 연산자의 경우 연산 결과는 다음과 같습니다.>= 이 조건은 값이 을 NaN 비롯한 NaN다른 double 값보다 크거나, 작거나float, 같지 않음을 의미합니다. 자세한 내용과 예제는 Double.NaN 또는 Single.NaN 참조 문서를 참조하세요.

기본 정수 형식의 해당 값이 같은 경우 동일한 열거형 형식의 피연산자가 동일합니다.

사용자 정의 구조체 형식은 기본적으로 == 연산자를 지원하지 않습니다. == 연산자를 지원하려면 사용자 정의 구조체가 해당 연산자를 오버로드해야 합니다.

C# 튜플은== 연산자를 != 기본적으로 지원합니다. 자세한 내용은 튜플 형식 문서의 튜플 같음 섹션을 참조하세요.

참조 형식 같음

기본적으로 레코드를 제외한 참조 형식 피연산자는 동일한 개체를 참조하는 경우 동일합니다.

public class ReferenceTypesEquality
{
    public class MyClass
    {
        private int id;

        public MyClass(int id) => this.id = id;
    }

    public static void Main()
    {
        var a = new MyClass(1);
        var b = new MyClass(1);
        var c = a;
        Console.WriteLine(a == b);  // output: False
        Console.WriteLine(a == c);  // output: True
    }
}

이 예제에서 표시한 대로 사용자 지정 참조 형식은 기본적으로 == 연산자를 지원합니다. 그러나 참조 형식은 == 연산자를 오버로드할 수 있습니다. 참조 형식이 == 연산자를 오버로드하는 경우 Object.ReferenceEquals 메서드를 사용하여 해당 형식의 두 참조가 동일한 개체를 참조하는지 확인합니다.

레코드 형식 같음

레코드 형식은 기본적으로 값 같음 의미 체계를 제공하는 ==!= 연산자를 지원합니다. 즉, 두 레코드 피연산자는 둘 다 null 또는 모든 필드의 해당 값이고 자동으로 구현된 속성이 같을 때 동일합니다.

public class RecordTypesEquality
{
    public record Point(int X, int Y, string Name);
    public record TaggedNumber(int Number, List<string> Tags);

    public static void Main()
    {
        var p1 = new Point(2, 3, "A");
        var p2 = new Point(1, 3, "B");
        var p3 = new Point(2, 3, "A");

        Console.WriteLine(p1 == p2);  // output: False
        Console.WriteLine(p1 == p3);  // output: True

        var n1 = new TaggedNumber(2, new List<string>() { "A" });
        var n2 = new TaggedNumber(2, new List<string>() { "A" });
        Console.WriteLine(n1 == n2);  // output: False
    }
}

앞의 예제와 같이 참조 형식 멤버의 경우 참조된 인스턴스가 아니라 참조 값이 비교됩니다.

문자열 같음

두 개의 문자열 피연산자가 모두 null이거나 두 문자열 인스턴스가 같은 길이고 각 문자 위치에 동일한 문자가 있을 때 동일합니다.

string s1 = "hello!";
string s2 = "HeLLo!";
Console.WriteLine(s1 == s2.ToLower());  // output: True

string s3 = "Hello!";
Console.WriteLine(s1 == s3);  // output: False

문자열 같음 비교는 대/소문자를 구분하는 서수 비교입니다. 문자열 비교에 대한 자세한 내용은 C#에서 문자열을 비교하는 방법을 참조하세요.

대리자 같음

동일한 런타임 형식의 두 대리자 피연산자는 둘 다 null 이거나 호출 목록이 길이가 같고 각 위치에 동일한 항목이 있는 경우 동일합니다.

Action a = () => Console.WriteLine("a");

Action b = a + a;
Action c = a + a;
Console.WriteLine(object.ReferenceEquals(b, c));  // output: False
Console.WriteLine(b == c);  // output: True

중요합니다

호출 목록의 등가 항목에는 수신자를 포함하여 호출의 모든 고정 매개 변수가 포함됩니다. 수신기는 항목이 호출될 this 때 나타내는 개체의 인스턴스입니다.

var o1 = new object();
var o2 = new object();
var d1 = o1.ToString;
var d2 = o2.ToString;
Console.WriteLine(object.ReferenceEquals(d1, d2));  // output: False
Console.WriteLine(d1 == d2);  // output: False (different receivers)

자세한 내용은 C# 언어 사양대리자 같음 연산자 섹션을 참조하세요.

다음 예제와 같이 의미상 동일한 람다 식을 계산할 때 오는 대리자는 같지 않습니다.

Action a = () => Console.WriteLine("a");
Action b = () => Console.WriteLine("a");

Console.WriteLine(a == b);  // output: False
Console.WriteLine(a + b == a + b);  // output: True
Console.WriteLine(b + a == a + b);  // output: False

같지 않음 연산자 !=

같지 않음 연산 != 자는 피연산자가 같지 않으면 반환하고false, 그렇지 않으면 반환 true 합니다. 기본 제공 형식의 피연산자의 경우 식 x != y는 식 !(x == y)와 동일한 결과를 생성합니다. 형식 같음에 대한 자세한 내용은 같음 연산자 섹션을 참조하세요.

다음 예제에서는 연산자를 사용하는 != 방법을 보여 줍니다.

int a = 1 + 1 + 2 + 3;
int b = 6;
Console.WriteLine(a != b);  // output: True

string s1 = "Hello";
string s2 = "Hello";
Console.WriteLine(s1 != s2);  // output: False

object o1 = 1;
object o2 = 1;
Console.WriteLine(o1 != o2);  // output: True

연산자 오버로드 가능성

사용자 정의 형식의 == 연산자와 != 연산자를 오버로드할 수 있습니다. 이러한 두 연산자 중 하나를 오버로드하는 경우 다른 연산자도 오버로드해야 합니다.

레코드 형식의 연산자와 != 연산자를 == 명시적으로 오버로드할 수 없습니다. 레코드 형식T에 대한 연산자 ==!= 연산자의 동작을 변경하려면 다음 시그니처를 IEquatable<T>.Equals 사용하여 메서드를 구현합니다.

public virtual bool Equals(T? other);

C# 언어 사양

자세한 내용은 C# 언어 사양관계형 및 형식 테스트 연산자 섹션을 참조하세요.

레코드 형식 같음에 관한 자세한 내용은 레코드 기능 제안 노트같음 멤버 섹션을 참조하세요.

참고 항목