[C#] Record 란
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/
C# 9 Deep Dive: Records
In a C# 9 deep dive, we go in depth on records.
www.daveabrock.com
https://www.csharpstudy.com/Latest/CS9-record.aspx
C# 9 레코드 타입 - C# 프로그래밍 배우기 (Learn C# Programming)
C# 9.0: 레코드(record) 타입 C# 9.0 에서 가장 두드러진 변화는 record 타입을 새로 도입한 것이다. 지금까지의 C#/.NET에서는 struct를 사용하는 Value Type(값 타입)과 class를 사용하는 Reference Type(레퍼런스
www.csharpstudy.com