public UserResult GetUser(int id) =>
_users.TryGetValue(id, out var user)
? user
: new NotFound(id);
و فراخواننده مجبور است هر دو حالت را مدیریت کند؛ کامپایلر اجازه نخواهد داد که یکی از آنها را فراموش کنید:
IResult response = GetUser(42) switch
{
User user => Results.Ok(user),
NotFound found => Results.NotFound($"No user with id {found.Id}"),
};
تمام ایده همین است.
نوع بازگشتی متد حقیقت را بیان میکند:
اینها دقیقاً حالتهایی هستند که دریافت خواهید کرد و نمیتوانید بهصورت تصادفی یکی از آنها را نادیده بگیرید.
دیگر نیازی نیست برای فهمیدن اینکه متد چه Exceptionهایی ممکن است پرتاب کند، بدنه آن را بررسی کنید.
⚠️ چند نکته مهم
این قابلیت هنوز در مرحله Preview و Experimental قرار دارد.
چند نکته که باید در نظر داشته باشید:
🔹 این قابلیت C# 15 و NET 11. را هدف قرار داده است و ممکن است Syntax آن تا زمان انتشار نهایی تغییر کند. برای آزمایش میتوانید از NET 11 Preview 4. یا نسخههای جدیدتر استفاده کنید.
🔹 در پشت صحنه، Union به یک Struct تبدیل میشود که Caseهای Value Type را Boxing کرده و محتوا را به شکل یک ?
object نگهداری میکند. برای سناریوهای حساس به Performance مسیر Non-Boxing نیز در نظر گرفته شده است، اما رفتار پیشفرض ساده نگه داشته شده است.🔹 این قابلیت فعلاً یک Type Union (A یا B) است، نه یک Discriminated Union کامل با Caseهای نامگذاریشده. با این حال، بخش عمده سناریوهایی را که امروز برای آنها از OneOf استفاده میکنم پوشش میدهد.
📌 جمعبندی
ءUnion Typeها یکی از خلأهای قدیمی و مهم #C را برطرف میکنند.
شما میتوانید:
public union Name(A, B, C);
تعریف کنید.
مقادیر Caseها را مستقیماً Assign کنید و از Conversionهای ضمنی استفاده کنید.
ءPattern Matching را همراه با بررسی کامل Exhaustiveness توسط کامپایلر انجام دهید، بدون اینکه به
default یا _ نیاز داشته باشید.ءResultها، Optionها و خروجیهای «یکی از این چند حالت» را بدون نیاز به Marker Interfaceها، Base Classها یا کتابخانههای جانبی مدلسازی کنید.
این قابلیت از نظر Syntax کوچک است، اما تأثیر بسیار بزرگی دارد:
امضای متدها بالاخره حقیقت را درباره خروجی خود بیان میکنند و کامپایلر نیز اطمینان حاصل میکند که تمام حالتها بهدرستی مدیریت شدهاند.
🙏 از اینکه مطالعه کردید متشکرم.
🔖هشتگها:
#csharp #dotnet11 #csharp15 #uniontypes