728x90
반응형
출처 : https://thecodeblogger.com/2021/11/26/c-record-how-is-it-different-from-classes/
Record란?
Record는 사용자정의 type을 생성할 수 있는 또다른 방법이다.
class, struct와 같이 record도 정의할 수 있다. 다른 점은 'class' or 'struct' keyword 대신 'record' keyword를 사용한다.
record type은 값 형식 또는 참조 형식으로 정의될 수 있다.
- record class로 정의하면 참조 형식, class는 빼도 된다.
- record struct로 정의하면 값 형식
- abstract를 붙이면 인스턴스화 할 수 없고, sealed를 붙이면 상속할 수 없다.
Class와 다른 점은?
class와 마찬가지로, record 또한 참조 형식이다. 하지만, 객체가 같은지 비교를 한는 기준이 다르다.
class type의 두 변수가 같을 경우
- 동일한 class type
- 두 변수가 같은 object를 가리킬 때
record type의 두 변수가 같을 경우
- 동일한 record type
- records의 값이 같을 때
namespace ConsoleApp1
{
public abstract record Person(string FirstName, string LastName);
public record Employee(string EmployeeId, string FirstName, string LastName)
: Person(FirstName, LastName);
public abstract class PersonClass
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class EmployeeClass : PersonClass
{
public string EmployeeId { get; set; }
}
class Program
{
static void Main(string[] args)
{
var firstRecord = new Employee("EMP_ID_1", "John", "Doe");
var secondRecord = new Employee("EMP_ID_1", "John", "Doe");
var compareResult = firstRecord == secondRecord ? "ARE EQUAL" : "ARE NOT EQUAL";
Console.WriteLine("----------------------------------------------------");
Console.WriteLine();
Console.WriteLine($"RECORD-1 : {firstRecord.ToString()}");
Console.WriteLine($"RECORD-2 : {secondRecord.ToString()}");
Console.WriteLine($"RECORDS: {compareResult}");
Console.WriteLine();
// -------------------------------------------------------------
// Classes - Equality Comaprison
// -------------------------------------------------------------
var firstObj = new EmployeeClass()
{
EmployeeId = "EMP_ID_1",
FirstName = "John",
LastName = "Doe"
};
var secondObj = new EmployeeClass()
{
EmployeeId = "EMP_ID_1",
FirstName = "John",
LastName = "Doe"
};
Console.WriteLine("----------------------------------------------------");
Console.WriteLine();
var classComparison = firstObj == secondObj ? "ARE EQUAL" : "ARE NOT EQUAL";
Console.WriteLine($"Object-1 : {firstObj.ToString()}");
Console.WriteLine($"Object-2 : {secondObj.ToString()}");
Console.WriteLine($"Classes: {classComparison }");
Console.WriteLine();
Console.WriteLine("----------------------------------------------------");
}
}
}
----------------------------------------------------
RECORD-1 : Employee { FirstName = John, LastName = Doe, EmployeeId = EMP_ID_1 }
RECORD-2 : Employee { FirstName = John, LastName = Doe, EmployeeId = EMP_ID_1 }
RECORDS: ARE EQUAL
----------------------------------------------------
Object-1 : ConsoleApp1.EmployeeClass
Object-2 : ConsoleApp1.EmployeeClass
Classes: ARE NOT EQUAL
----------------------------------------------------
class와 toString()함소를 호출했을때의 결과와, equal 비교결과가 다르다.
그 이유는 compiler가 record type을 위해서 아래 함수들을 override하여 생성하기 때문이다.
- An override of Object.Equals(Object).
- A virtual Equals method whose parameter is the record type.
- An override of Object.GetHashCode().
- Methods for operator == and operator !=.
- Record types implement System.IEquatable<T>.
728x90
반응형
'C#' 카테고리의 다른 글
C#] Anonymous Type(무명 형식) 정의, 사용법, Dynamic Type과 비교 (0) | 2022.06.28 |
---|---|
YouTube Data API ] 재생목록의 동영상리스트 데이터 가져오기 (0) | 2022.06.17 |
C#] LINQ to XML(XDocument) vs XML DOM(XmlDocument) (0) | 2022.01.04 |
C#] Value type은 어디에 저장되는가? Stack or Heap?? (0) | 2021.12.24 |
C#] 제네릭 제약조건 : where, default 연산자 (0) | 2021.12.16 |
댓글