경우에 따라 두 값을 같음으로 비교해야 합니다. 경우에 따라 값 같음( 동등성이라고도 함)을 테스트합니다. 즉, 두 변수에 포함된 값이 같음을 의미합니다. 다른 경우에는 두 변수가 메모리에서 동일한 기본 개체를 참조하는지 여부를 결정해야 합니다. 이러한 유형의 같음을 참조 같음 또는 ID라고 합니다. 이 항목에서는 이러한 두 종류의 같음을 설명하고 자세한 내용을 보려면 다른 항목에 대한 링크를 제공합니다.
참조 동일성
참조 같음은 두 개체 참조가 동일한 기본 개체를 참조한다는 것을 의미합니다. 이 문제는 다음 예제와 같이 간단한 할당을 통해 발생할 수 있습니다.
using System;
class Test
{
public int Num { get; set; }
public string Str { get; set; }
public static void Main()
{
Test a = new Test() { Num = 1, Str = "Hi" };
Test b = new Test() { Num = 1, Str = "Hi" };
bool areEqual = System.Object.ReferenceEquals(a, b);
// False:
System.Console.WriteLine($"ReferenceEquals(a, b) = {areEqual}");
// Assign b to a.
b = a;
// Repeat calls with different results.
areEqual = System.Object.ReferenceEquals(a, b);
// True:
System.Console.WriteLine($"ReferenceEquals(a, b) = {areEqual}");
}
}
이 코드에서는 두 개의 개체가 만들어지지만 assignment 문 후에는 두 참조가 모두 동일한 개체를 참조합니다. 따라서 참조 동등성이 있습니다. 메서드를 ReferenceEquals 사용하여 두 참조가 동일한 개체를 참조하는지 여부를 확인합니다.
참조 같음의 개념은 참조 형식에만 적용됩니다. 값 형식의 인스턴스가 변수에 할당될 때 값의 복사본이 만들어지므로 값 형식 개체에 참조 같음이 있을 수 없습니다. 따라서 메모리에서 동일한 위치를 참조하는 두 개의 unboxed 구조체를 가질 수 없습니다. 또한 두 값 형식을 비교하는 데 사용하는 ReferenceEquals 경우 개체에 포함된 값이 모두 동일한 경우에도 결과가 항상 false
표시됩니다. 이는 각 변수가 별도의 개체 인스턴스로 상자화되기 때문입니다. 자세한 내용은 참조 같음(ID)을 테스트하는 방법을 참조하세요.
평등의 가치
값 같음은 두 개체에 동일한 값 또는 값이 포함되어 있음을 의미합니다. int 또는 bool과 같은 기본 값 형식의 경우 값 같음 테스트는 간단합니다. 다음 예제와 == 같이 연산자를 사용할 수 있습니다.
int a = GetOriginalValue();
int b = GetCurrentValue();
// Test for value equality.
if (b == a)
{
// The two integers are equal.
}
대부분의 다른 형식에서 값 같음 테스트는 형식이 정의하는 방법을 이해해야 하기 때문에 더 복잡합니다. 필드나 속성이 여러 개 있는 클래스 및 구조체의 경우 값 같음은 모든 필드 또는 속성의 값이 같음을 의미하도록 정의되는 경우가 많습니다. 예를 들어 pointA.X가 pointB.X와 같고 pointA.Y가 pointB.Y와 같으면 두 Point
개체가 동일하게 정의될 수 있습니다. 레코드의 경우 값 같음은 형식이 일치하고 모든 속성과 필드 값이 일치하는 경우 레코드 형식의 두 변수가 같음을 의미합니다.
그러나 형식의 모든 필드를 기준으로 동등성이 있어야 한다는 요구 사항은 없습니다. 하위 집합을 기반으로 할 수 있습니다. 소유하지 않은 형식을 비교할 때 해당 형식에 대해 동등성이 정의되는 방법을 구체적으로 이해해야 합니다. 고유한 클래스 및 구조체에서 값 같음을 정의하는 방법에 대한 자세한 내용은 형식에 대한 값 같음을 정의하는 방법을 참조하세요.
부동 소수점 값의 동일성
부동 소수점 값(double 및 float)의 같음 비교는 이진 컴퓨터에서 부동 소수점 산술 연산이 부정확하기 때문에 문제가 됩니다. 자세한 내용은 항목 System.Double의 비고를 참조하세요.
관련 항목
제목 | 설명 |
---|---|
참조 같음을 테스트하는 방법(ID) | 두 변수에 참조 같음이 있는지 여부를 확인하는 방법을 설명합니다. |
형식에 대한 값 같음을 정의하는 방법 | 형식에 대한 값 같음의 사용자 지정 정의를 제공하는 방법을 설명합니다. |
유형 | C# 형식 시스템에 대한 정보와 추가 정보에 대한 링크를 제공합니다. |
레코드 | 기본적으로 값 같음을 테스트하는 레코드 형식에 대한 정보를 제공합니다. |
.NET