728x90
C# 9.0 부터 나온 개념으로 class와 유사하고 또 struct와도 유사한 타입입니다.
불변 객체로 값이 정의된 이후에는 변경이 불가능합니다.
아래처럼 간단하게 정의하여 사용이 가능합니다.
// 정의
public record PersonRecord(string? FirstName, string? LastName);
// 사용
var record = new PersonRecord("Kang", "Jun");
class는 object를 비교하지만
record는 비교 시 값을 비교하게 되므로 값 비교 시 유용하게 사용할 수 있습니다.
public record PersonRecord(string? FirstName, string? LastName);
public class PersonClass
{
public string? FirstName { get; set; }
public string? LastName { get; set; }
}
class Program
{
static void Main(string[] args)
{
// class compare
var firstObj = new PersonClass() { FirstName = "Kang", LastName = "Jun" };
var secondObj = new PersonClass() { FirstName = "Kang", LastName = "Jun" };
var classComparison = firstObj == secondObj ? "EQUAL" : "NOT EQUAL";
Console.WriteLine("----------------------------------------------------");
Console.WriteLine();
Console.WriteLine($"CLASS-1 : {firstObj.ToString()}");
Console.WriteLine($"CLASS-2 : {secondObj.ToString()}");
Console.WriteLine($"Classes: {classComparison}");
Console.WriteLine();
Console.WriteLine("----------------------------------------------------");
// record compare
var firstRecord = new PersonRecord("Kang", "Jun");
var secondRecord = new PersonRecord("Kang", "Jun");
var compareResult = firstRecord == secondRecord ? "EQUAL" : "NOT EQUAL";
Console.WriteLine("----------------------------------------------------");
Console.WriteLine();
Console.WriteLine($"RECORD-1 : {firstRecord.ToString()}");
Console.WriteLine($"RECORD-2 : {secondRecord.ToString()}");
Console.WriteLine($"RECORDS: {compareResult}");
Console.WriteLine();
// record 값 복사
var thirdRecord = firstRecord with { LastName = "HanDam" };
var compareResult2 = firstRecord == thirdRecord ? "EQUAL" : "NOT EQUAL";
Console.WriteLine("----------------------------------------------------");
Console.WriteLine();
Console.WriteLine($"RECORD-1 : {firstRecord.ToString()}");
Console.WriteLine($"RECORD-3 : {thirdRecord.ToString()}");
Console.WriteLine($"RECORDS: {compareResult2}");
Console.WriteLine();
}
}
위 코드에서 알수 있듯이 class를 객체 자체를 비교하므로 동일하지 않습니다
또한 ToString() 시 class 명이 출력됩니다.
하지만 record 는 값을 비교하므로 동일한 것으로 판단합니다.
또한 ToString() 시 record 명 그리고 필드와 값이 모두 출력됩니다.
값 복사 또한 매우 간단합니다.
아래처럼 with 구문을 이용해 값을 복사할 수 있으며 특정 필드 값을 바꾸고 싶은 경우
변경할 필드와 값을 넣어주면 됩니다.
var thirdRecord = firstRecord with { LastName = "HanDam" };
값을 바꿨으므로 당연히 비교한 결과는 동일하지 않은 것으로 판단합니다.
참고
https://www.daveabrock.com/2020/07/06/c-sharp-9-deep-dive-records/
https://www.csharpstudy.com/Latest/CS9-record.aspx
728x90
'C#' 카테고리의 다른 글
[C#] C# 11 - 복수 라인 처리 (0) | 2023.03.30 |
---|---|
[C#] 패턴 매칭 (0) | 2023.03.28 |
[C#/NATS] Docker NATS 서비스 이용해 Pub/Sub 하기 (0) | 2023.03.28 |
bin obj 폴더 일괄 삭제하기 (0) | 2023.02.19 |
[C#/gRPC] 대용량 데이터 Stream 전달시 에러 - HTTP/2 INTERNAL_ERROR (0) | 2023.01.13 |