مثالهای عملی مستقل
مثالها از تبدیل پایه شروع میشوند و به داده دستهای، null، مقدار مرزی، خطای کنترلشده و مسیر بهینه میرسند. هر نمونه یک برنامه کامل کنسولی است و خروجی نمایشی اجازه میدهد نتیجه را بدون اجرای فوری کد بررسی کنید.
مثال 1: تبدیل نام استاندارد Enum
نام دقیق عضو شمارشی به نوع OrderStatus تبدیل میشود و نتیجه خوانا باقی میماند.
using System;
public enum OrderStatus
{
New = 1,
Processing = 2,
Shipped = 3,
Cancelled = 4
}
public static class Program
{
public static void Main()
{
string text = "Processing";
OrderStatus status = Enum.Parse<OrderStatus>(text);
Console.WriteLine(status);
}
}
| ورودی یا سناریو | خروجی نمونه | نکته |
|---|
| Processing | Processing | تبدیل نام استاندارد Enum |
کاربرد عملی این الگو در وضعیت سفارش، نقش کاربر، سطح دسترسی، نوع عملیات و تنظیمات دامنهای خوانا دیده میشود. در نسخه تولیدی، پیام خطا، ثبت رخداد، حریم خصوصی داده و تست واحد را متناسب با قرارداد سامانه تکمیل کنید.
مثال 2: نادیدهگرفتن بزرگی و کوچکی حروف
در ورودیهای متنی کنترلشده میتوان ignoreCase را فعال کرد تا تفاوت حروف باعث شکست نشود.
using System;
public enum OrderStatus
{
New = 1,
Processing = 2,
Shipped = 3,
Cancelled = 4
}
public static class Program
{
public static void Main()
{
string text = "shipped";
OrderStatus status = Enum.Parse<OrderStatus>(text, ignoreCase: true);
Console.WriteLine(status);
}
}
| ورودی یا سناریو | خروجی نمونه | نکته |
|---|
| Processing | Shipped | نادیدهگرفتن بزرگی و کوچکی حروف |
کاربرد عملی این الگو در وضعیت سفارش، نقش کاربر، سطح دسترسی، نوع عملیات و تنظیمات دامنهای خوانا دیده میشود. در نسخه تولیدی، پیام خطا، ثبت رخداد، حریم خصوصی داده و تست واحد را متناسب با قرارداد سامانه تکمیل کنید.
مثال 3: پردازش مجموعه وضعیتها
چند وضعیت مستقل پردازش میشوند و هر مقدار به عضو متناظر تبدیل میگردد.
using System;
public enum OrderStatus
{
New = 1,
Processing = 2,
Shipped = 3,
Cancelled = 4
}
public static class Program
{
public static void Main()
{
string[] states = { "New", "Processing", "Cancelled" };
foreach (string text in states)
{
Console.WriteLine(Enum.Parse<OrderStatus>(text));
}
}
}
| ورودی یا سناریو | خروجی نمونه | نکته |
|---|
| Processing | New، Processing، Cancelled | پردازش مجموعه وضعیتها |
کاربرد عملی این الگو در وضعیت سفارش، نقش کاربر، سطح دسترسی، نوع عملیات و تنظیمات دامنهای خوانا دیده میشود. در نسخه تولیدی، پیام خطا، ثبت رخداد، حریم خصوصی داده و تست واحد را متناسب با قرارداد سامانه تکمیل کنید.
مثال 4: استفاده در شرط گردش کار
نتیجه Parse مستقیماً در تصمیم دامنهای و انتقال مرحله سفارش استفاده میشود.
using System;
public enum OrderStatus
{
New = 1,
Processing = 2,
Shipped = 3,
Cancelled = 4
}
public static class Program
{
public static void Main()
{
string text = "Processing";
OrderStatus status = Enum.Parse<OrderStatus>(text);
if (status == OrderStatus.Processing)
{
Console.WriteLine("Prepare shipment");
}
}
}
| ورودی یا سناریو | خروجی نمونه | نکته |
|---|
| Processing | Prepare shipment | استفاده در شرط گردش کار |
کاربرد عملی این الگو در وضعیت سفارش، نقش کاربر، سطح دسترسی، نوع عملیات و تنظیمات دامنهای خوانا دیده میشود. در نسخه تولیدی، پیام خطا، ثبت رخداد، حریم خصوصی داده و تست واحد را متناسب با قرارداد سامانه تکمیل کنید.
مثال 5: تبدیل نمایش عددی
Enum.Parse نمایش عددی را نیز میپذیرد؛ اعتبار دامنه باید جداگانه بررسی شود.
using System;
public enum OrderStatus
{
New = 1,
Processing = 2,
Shipped = 3,
Cancelled = 4
}
public static class Program
{
public static void Main()
{
string text = "2";
OrderStatus status = Enum.Parse<OrderStatus>(text);
Console.WriteLine(status);
}
}
| ورودی یا سناریو | خروجی نمونه | نکته |
|---|
| Processing | Processing | تبدیل نمایش عددی |
کاربرد عملی این الگو در وضعیت سفارش، نقش کاربر، سطح دسترسی، نوع عملیات و تنظیمات دامنهای خوانا دیده میشود. در نسخه تولیدی، پیام خطا، ثبت رخداد، حریم خصوصی داده و تست واحد را متناسب با قرارداد سامانه تکمیل کنید.
مثال 6: مدیریت مقدار تهی پیش از Parse
چون مقدار null قابل تبدیل نیست، قرارداد جایگزین قبل از فراخوانی اعمال میشود.
using System;
public enum OrderStatus
{
New = 1,
Processing = 2,
Shipped = 3,
Cancelled = 4
}
public static class Program
{
public static void Main()
{
string? text = null;
OrderStatus status = text is null
? OrderStatus.New
: Enum.Parse<OrderStatus>(text, true);
Console.WriteLine(status);
}
}
| ورودی یا سناریو | خروجی نمونه | نکته |
|---|
| Processing | New | مدیریت مقدار تهی پیش از Parse |
کاربرد عملی این الگو در وضعیت سفارش، نقش کاربر، سطح دسترسی، نوع عملیات و تنظیمات دامنهای خوانا دیده میشود. در نسخه تولیدی، پیام خطا، ثبت رخداد، حریم خصوصی داده و تست واحد را متناسب با قرارداد سامانه تکمیل کنید.
مثال 7: کنترل مقدار عددی تعریفنشده
موفقیت Parse عددی به معنای تعریفشدن عضو نیست؛ Enum.IsDefined این فاصله را پوشش میدهد.
using System;
public enum OrderStatus
{
New = 1,
Processing = 2,
Shipped = 3,
Cancelled = 4
}
public static class Program
{
public static void Main()
{
string text = "99";
OrderStatus status = Enum.Parse<OrderStatus>(text);
Console.WriteLine(Enum.IsDefined(status));
}
}
| ورودی یا سناریو | خروجی نمونه | نکته |
|---|
| Processing | False | کنترل مقدار عددی تعریفنشده |
کاربرد عملی این الگو در وضعیت سفارش، نقش کاربر، سطح دسترسی، نوع عملیات و تنظیمات دامنهای خوانا دیده میشود. در نسخه تولیدی، پیام خطا، ثبت رخداد، حریم خصوصی داده و تست واحد را متناسب با قرارداد سامانه تکمیل کنید.
مثال 8: سناریوی واقعی وضعیت سفارش
مقدار متنی گردش کار به وضعیت نوعدار تبدیل و مقدار ذخیرهسازی آن نمایش داده میشود.
using System;
public enum OrderStatus
{
New = 1,
Processing = 2,
Shipped = 3,
Cancelled = 4
}
public static class Program
{
public static void Main()
{
string workflowState = "Shipped";
OrderStatus status = Enum.Parse<OrderStatus>(workflowState, true);
Console.WriteLine($"Persisted value={(int)status}");
}
}
| ورودی یا سناریو | خروجی نمونه | نکته |
|---|
| Processing | Persisted value=3 | سناریوی واقعی وضعیت سفارش |
کاربرد عملی این الگو در وضعیت سفارش، نقش کاربر، سطح دسترسی، نوع عملیات و تنظیمات دامنهای خوانا دیده میشود. در نسخه تولیدی، پیام خطا، ثبت رخداد، حریم خصوصی داده و تست واحد را متناسب با قرارداد سامانه تکمیل کنید.
مثال 9: مدیریت نام نامعتبر
نام ناشناخته ArgumentException ایجاد میکند و در مرز معتبر برنامه مدیریت میشود.
using System;
public enum OrderStatus
{
New = 1,
Processing = 2,
Shipped = 3,
Cancelled = 4
}
public static class Program
{
public static void Main()
{
string text = "Unknown";
try
{
_ = Enum.Parse<OrderStatus>(text, true);
}
catch (ArgumentException)
{
Console.WriteLine("Unknown status");
}
}
}
| ورودی یا سناریو | خروجی نمونه | نکته |
|---|
| Processing | Unknown status | مدیریت نام نامعتبر |
کاربرد عملی این الگو در وضعیت سفارش، نقش کاربر، سطح دسترسی، نوع عملیات و تنظیمات دامنهای خوانا دیده میشود. در نسخه تولیدی، پیام خطا، ثبت رخداد، حریم خصوصی داده و تست واحد را متناسب با قرارداد سامانه تکمیل کنید.
مثال 10: نسخه مقاوم و بهینه با TryParse
برای ورودی کاربر TryParse همراه IsDefined هم استثنا را حذف میکند و هم دامنه را میسنجد.
using System;
public enum OrderStatus
{
New = 1,
Processing = 2,
Shipped = 3,
Cancelled = 4
}
public static class Program
{
public static void Main()
{
string text = "Cancelled";
if (Enum.TryParse(text, true, out OrderStatus status)
&& Enum.IsDefined(status))
{
Console.WriteLine(status);
}
}
}
| ورودی یا سناریو | خروجی نمونه | نکته |
|---|
| Processing | Cancelled | نسخه مقاوم و بهینه با TryParse |
کاربرد عملی این الگو در وضعیت سفارش، نقش کاربر، سطح دسترسی، نوع عملیات و تنظیمات دامنهای خوانا دیده میشود. در نسخه تولیدی، پیام خطا، ثبت رخداد، حریم خصوصی داده و تست واحد را متناسب با قرارداد سامانه تکمیل کنید.
سؤالات متداول
۱. Enum.Parse() دقیقاً چه کاری انجام میدهد؟
Enum.Parse() نمایش متنی معتبر را مطابق قواعد نوع مقصد به یک مقدار نوعدار تبدیل میکند. نتیجه پس از تبدیل میتواند در محاسبه، شرط، ذخیرهسازی یا منطق دامنه استفاده شود و دیگر لازم نیست با رشته خام کار کنیم.
۲. چه زمانی استفاده از Enum.Parse() برای تازهکاران مناسب است؟
وقتی منبع داده مورد اعتماد است، قالب از قبل اعتبارسنجی شده و شکست واقعاً یک وضعیت استثنایی محسوب میشود، Parse انتخابی ساده و خواناست. برای ورودی مستقیم کاربر معمولاً TryParse تجربه مقاومتری ایجاد میکند.
۳. آیا استفاده درست از Enum.Parse() هزینه نگهداری پروژه را کم میکند؟
بله؛ تبدیل در مرز سیستم و انتقال مقدار نوعدار به لایههای داخلی، شرطهای تکراری و خطاهای پنهان را کاهش میدهد. این جداسازی در پروژههای تجاری، گزارشگیری و سامانههای چندلایه ارزش زیادی دارد.
۴. در پروژه سفارشی چگونه سیاست تبدیل Enum.Parse() طراحی میشود؟
قالب ورودی، فرهنگ، رفتار null، محدوده مجاز، پیام خطا و محل ثبت رخداد باید در قرارداد ورودی مشخص شوند. سپس تبدیل در یک نقطه مشترک مانند Validator، Mapper یا لایه ورودی پیادهسازی و با تست پوشش داده میشود.
۵. تفاوت کلیدی Parse و TryParse برای Enum.Parse() چیست؟
Parse در شکست استثنا پرتاب میکند، ولی TryParse با یک مقدار bool موفقیت را گزارش میدهد و خروجی را از پارامتر out تحویل میدهد. تفاوت اصلی در قرارداد شکست است، نه صرفاً شکل نوشتن کد.
۶. برای پیادهسازی حرفهای Enum.Parse() چه خدماتی لازم میشود؟
در سامانه حساس میتوان از بازبینی قرارداد داده، طراحی اعتبارسنجی، تست دادههای مرزی، پروفایل کارایی و ثبت خطای ساختیافته استفاده کرد. مشاوره فنی کمک میکند این تصمیمها با معماری و نیاز واقعی محصول هماهنگ شوند.
۷. خطاهای رایج Enum.Parse() کداماند؟
ارسال null، رشته خالی، قالب ناسازگار، عدد خارج از محدوده، فرهنگ اشتباه و گرفتن کلی همه Exceptionها از خطاهای پرتکرار هستند. ثبت مقدار حساس نیز باید با قواعد امنیت و حریم خصوصی هماهنگ شود.
۸. آیا Enum.Parse() از نظر Performance کند است؟
روی ورودی معتبر معمولاً تبدیل سریع است؛ مشکل اصلی زمانی رخ میدهد که داده نامعتبر زیاد باشد و Parse مرتب استثنا بسازد. اندازهگیری با داده واقعی، Release build، Runtime هدف و ابزار مناسب از حدس بهتر است.
۹. بهترین روش استفاده از Enum.Parse() چیست؟
فرهنگ و قالب را صریح کنید، تبدیل را در مرز ورودی نگه دارید، دامنه مجاز را جداگانه بسنجید، از تبدیل تکراری جلوگیری کنید و برای تمام کرانها تست داشته باشید. شکست قابل انتظار را نیز با TryParse مدل کنید.
۱۰. Enum.Parse() با کدام نسخههای C# و .NET سازگار است؟
شکلهای پایه Parse سالهاست در .NET وجود دارند، اما overloadهای Generic، Span و رابطهای جدید مانند IParsable به نسخه Runtime وابستهاند. پیش از استفاده از overload جدید، Target Framework پروژه و مستندات همان نسخه را کنترل کنید.