recorc, struct 불변타입
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
C# 9에 record라는 class와 유사하고 또 struct와도 유사한 타입이 생겼습니다. 불변개체를 다루기 위한 타입인데, 사실 class또는 struct으로 이와 유사하거나 거의 동일하게 쓸수는 있습니다만, record타입을 추가해서 코딩량을 줄이고 불변개체사용을 유도하며 사실은 함수형 언어의 장점을 차용한 기능이라고 할 수 있겠네요. 간단히 사용해 본 결과 코드량이 줄고 record 으로 만들어진 인스턴스의 모든 요소가 불변성이라는 인식(믿음)이 프로그래밍 하는데 상당히 유용하다는 것을 깨달았습니다. 아래 글은 Record가 무엇인지에 대해 잘 설명한 글입니다.
C# 구조체는 언제든 초기화되지 않은 값, 임의 구조체 T에 대해 그러니까 default(T)가 존재할 수 있다는 것을 감안하지 않을 수 없는데, 그에 비해 레코드는 언제나 일정하게 초기화되어 있다는 가정을 할 수 있어서 그것도 좋은 것 같습니다. C# 구조체는 이름부터가 결국 C/C++ 스타일 구조체로부터의 연속성을 아주 버리진 못한 느낌이지요. 심지어 기본 생성자를 재정의할 수 조차 없어서 모든 필드가 default 값으로 채워진(필드가 참조 타입이면 null) 초기화가 아예 안 된 상태가 있다는 것을 받아들여야 하는데, 단순히 불변 객체로 만들어서 쓰기에는 제약이 너무 컸습니다.
C# 9의 Record와 Struct의 차이점
C# 9에 record라는 class와 유사하고 또 struct와도 유사한 타입이 생겼습니다. 불변개체를 다루기 위한 타입인데, 사실 class또는 struct으로 이와 유사하거나 거의 동일하게 쓸수는 있습니다만, record타
forum.dotnetdev.kr
https://www.sysnet.pe.kr/2/0/12392
.NET Framework: 959. C# 9.0 - (9) 레코드(Records)
.NET Framework: 959. C# 9.0 - (9) 레코드(Records) [링크 복사], [링크+제목 복사] 조회: 2817 글쓴 사람 정성태 (techsharer at outlook.com) 홈페이지 첨부 파일 부모글 보이기/감추기 C# 9.0 - (9) 레코드(Records) C# 9.0 -
www.sysnet.pe.kr
예제
// 예제(1)
public record Person
{
public string Name { get; }
public int Age { get; }
public Person(string name, int age)
=> (Name, Age) = (name, age);
}
class Program
{
static void Main(string[] args)
{
Person p = new Person("Tom", 30);
string s = p.Name;
}
}
예제
// 예제(2)
public record Person
{
public string Name { get; init; }
public int Age { get; init; }
}
class Program
{
static void Main(string[] args)
{
Person p = new Person
{
Name = "Tom",
Age = 30
};
}
}
예제
// 예제(3)
Person tom1 = new Person
{
Name = "Tom",
Age = 30
};
Person tom2 = tom1 with { Age = 40 };
예제
// 예제(4)
Person p1 = new Person
{
Name = "Tom",
Age = 30
};
Person p2 = new Person
{
Name = "Tom",
Age = 30
};
bool same = p1.Equals(p2); // true
bool b = ReferenceEquals(p1, p2); //false
예제
// 예제(5) 레코드에 Constructor/Deconstructor 사용
public record Person
{
public string Name { get; init; }
public int Age { get; init; }
public Person(string name, int age)
=> (Name, Age) = (name, age);
public void Deconstruct(out string name, out int age)
=> (name, age) = (Name, Age);
}
// 예제(6) Positional record
public record Person(string Name, int Age);
// 예제(7)
class Program
{
static void Main(string[] args)
{
// Constructor 사용
Person tom = new Person("Tom", 30);
// Deconstructor 사용
var (name, age) = tom;
Console.WriteLine($"{name}, {age}");
}
}
예제
// 예제(8) 파생 record
public record Person
{
public string Name { get; init; }
public int Age { get; init; }
}
public record Employee : Person
{
public int Id { get; init; }
}
class Program
{
static void Main(string[] args)
{
Person p1 = new Employee
{
Id = 1001,
Name = "Tom",
Age = 30
};
}
}
'coding > c#' 카테고리의 다른 글
C# byte[] (0) | 2021.12.21 |
---|---|
Encoding.UTF8.GetBytes (0) | 2021.12.20 |
mssql 설치 (0) | 2021.12.20 |
C# 네트워크 클래스 (0) | 2021.12.20 |
C# 공부 링크 (0) | 2021.12.17 |