using CustomerId = int;
using OrderId = int;
CustomerId customerId = 1;
OrderId orderId = 2;
customerId = orderId; // 가능
OrderId 타입을 CustomerId 타입 변수에 넣고 싶지 않은데… C#은 언어에서 지원 하지 않지요.
F#은 언어에서 지원합니다 ㅋㅋ
type CustomerId = CustomerId of int
type OrderId = OrderId of int
let mutable customerId = CustomerId 1
let orderId = OrderId 1
customerId <- CustomerId 2
customerId <- orderId; // Error: This expression was expected to have type customerId but here has type OrderId
F# 처럼 간단하진 않지만, C# 에는 readonly struct record 가 있습니다.
readonly record struct CustomerId(int Value);
readonly record struct OrderId(int Value);
var ci = new CustomerId(1);
CustomerId ci2 = default;
var equals = ci == ci2;
equals = ci.Equals(ci2);
// 에러
// ci.Value = 3;
var oi = new OrderId(1);
// 에러
// ci = oi;
readonly record struct 는 EF Core 나 IEnumerable 에서 지원합니다.
class Customer
{
public CustomerId Id { get; set; }
}
var customer = await db.Customers.FindAsync(ci);
var order = orders.FirstOrDefault(o => o.Id == oi);
아쉬운 점은 readonly 를 항상 붙여 줘야 해서 장황하다는 점입니다. record struct 에 불변성을 부여하지 않아, 부랴 부랴 급조한 느낌?
제가 본 Vogen의 예제 코드는 대부분 partial readonly struct 였습니다.
그래서, readonly record struct가 대부분의 기능이 커버가 가능하다는 점을 말씀 드리려 했습니다.
직렬화에 관해서는 그런 변환은 Vogen의 취지와 안 맞는 거 아닌가 하는 생각이 드네요.
class Strong { public A A { get; set; } }
class Primitive { public string A { get; set; }}
var strong = JsonSerializer.Deserialize<Strong>(json);
var aEquals = strong.A == myA;
// 문제 없음.
var primitive = JsonSerializer.Deserialize<Primitive>(json);
aEquals = primitive.A == "value";