Trong Haskell, có hai cách để cung cấp bí danh cho các loại: type
và newtype
. type
cung cấp một loại từ đồng nghĩa, có nghĩa là từ đồng nghĩa được coi bởi các kiểm tra kiểu như giống hệt nhau như các loại bản gốc:C# tương đương với kiểu mới của Haskell là gì?
type UserId = Int
hasAccess :: UserId -> Bool
hasAccess id = {-- stuff --}
-- Elsewhere in the program
login :: Int -> Bool
login n = hasAccess n -- Typechecker won't complain
Một newtype
là tương tự, nhưng được coi bởi các kiểm tra loại như một loại khác nhau :
newtype UserId = UserId Int
hasAccess :: UserId -> Bool
hasAccess (UserId id) = {-- stuff --}
-- Elsewhere in the program
login :: Int -> Bool
login n = hasAccess n -- Typechecker will complain, n isn't a UserId !
Trong C#, bạn có thể xác định từ đồng nghĩa loại với cấp cao nhất using
khai:
using UserId = Int;
Tuy nhiên, một bí danh loại được kiểm tra theo trình biên dịch mạnh mẽ dường như không có mặt trong C# theo mặc định. Tôi đã xem xét việc tạo mã tự động với các mẫu T4 và CodeDOM để tạo ra một trình bao bọc lớp, nhưng tôi không thực sự biết làm thế nào tôi có thể tích hợp một cách rõ ràng những luồng đó vào luồng lập trình của tôi.
Lý tưởng nhất, tôi muốn để có thể nói về một cấp cao nhất:
// Something like this?
using Int.UserId;
/* Elsewhere */
var id = new UserId(5);
public bool HasAccess(UserId id)
{
/* Stuff */
}
này đá các thế hệ mã vào bánh tại thời gian biên dịch. Nếu đó là không thể hoặc cung cấp một vấn đề gà và trứng cho IntelliSense, một tùy chọn biên dịch tự động chạy mỗi x phút (hoặc một nút hoặc bất cứ điều gì) sẽ được tốt đẹp.
Bạn có thể cung cấp một số thông tin cơ bản về lý do bạn muốn thực hiện việc này không? –
Tại sao bạn muốn biên dịch mã của mình sau mỗi x phút? – Georg
Việc sử dụng loại giấu dưới tên loại khác là gì? – Franck