مثالهای عملی مستقل
مثالها از تبدیل پایه شروع میشوند و به داده دستهای، null، مقدار مرزی، خطای کنترلشده و مسیر بهینه میرسند. هر نمونه یک برنامه کامل کنسولی است و خروجی نمایشی اجازه میدهد نتیجه را بدون اجرای فوری کد بررسی کنید.
مثال 1: تبدیل GUID قالب D
در سناریوی «تبدیل GUID قالب D»، Guid.Parse() یک رشته معتبر را به مقدار نوعدار تبدیل میکند تا ادامه برنامه با داده خام درگیر نباشد.
using System;
public static class Program
{
public static void Main()
{
string text = "6f9619ff-8b86-d011-b42d-00c04fc964ff";
Guid id = Guid.Parse(text);
Console.WriteLine(id);
}
}
| ورودی یا سناریو | خروجی نمونه | نکته |
|---|
| 6f9619ff-8b86-d011-b42d-00c04fc964ff | 6f9619ff-8b86-d011-b42d-00c04fc964ff | تبدیل GUID قالب D |
کاربرد عملی این الگو در شناسه موجودیتها، کلیدهای عمومی API، همگامسازی توزیعشده و رهگیری درخواست دیده میشود. در نسخه تولیدی، پیام خطا، ثبت رخداد، حریم خصوصی داده و تست واحد را متناسب با قرارداد سامانه تکمیل کنید.
مثال 2: تبدیل GUID قالب N
برای «تبدیل GUID قالب N»، فاصله یا شکل نمایش ورودی آگاهانه مدیریت میشود و قرارداد تبدیل روشن باقی میماند.
using System;
public static class Program
{
public static void Main()
{
string text = "6f9619ff8b86d011b42d00c04fc964ff";
Guid id = Guid.Parse(text);
Console.WriteLine(id.ToString("D"));
}
}
| ورودی یا سناریو | خروجی نمونه | نکته |
|---|
| 6f9619ff-8b86-d011-b42d-00c04fc964ff | 6f9619ff-8b86-d011-b42d-00c04fc964ff | تبدیل GUID قالب N |
کاربرد عملی این الگو در شناسه موجودیتها، کلیدهای عمومی API، همگامسازی توزیعشده و رهگیری درخواست دیده میشود. در نسخه تولیدی، پیام خطا، ثبت رخداد، حریم خصوصی داده و تست واحد را متناسب با قرارداد سامانه تکمیل کنید.
مثال 3: پردازش مجموعه شناسهها
نمونه «پردازش مجموعه شناسهها» چند مقدار مستقل را پردازش میکند و کاربرد این نوع را در شناسه موجودیتها، کلیدهای عمومی API، همگامسازی توزیعشده و رهگیری درخواست نشان میدهد.
using System;
public static class Program
{
public static void Main()
{
string[] ids =
{
"6f9619ff-8b86-d011-b42d-00c04fc964ff",
"7c9e6679-7425-40de-944b-e07fc1f90ae7"
};
foreach (string text in ids)
{
Console.WriteLine(Guid.Parse(text).ToString("N"));
}
}
}
| ورودی یا سناریو | خروجی نمونه | نکته |
|---|
| 6f9619ff-8b86-d011-b42d-00c04fc964ff | دو GUID در قالب N | پردازش مجموعه شناسهها |
کاربرد عملی این الگو در شناسه موجودیتها، کلیدهای عمومی API، همگامسازی توزیعشده و رهگیری درخواست دیده میشود. در نسخه تولیدی، پیام خطا، ثبت رخداد، حریم خصوصی داده و تست واحد را متناسب با قرارداد سامانه تکمیل کنید.
مثال 4: اعتبارسنجی شناسه مسیر API
در «اعتبارسنجی شناسه مسیر API»، خروجی نوعدار مستقیماً وارد شرط میشود؛ با این حال اعتبار دامنه از اعتبار قالب جدا نگه داشته میشود.
using System;
public static class Program
{
public static void Main()
{
string routeValue = "6f9619ff-8b86-d011-b42d-00c04fc964ff";
Guid id = Guid.Parse(routeValue);
if (id != Guid.Empty)
{
Console.WriteLine("Valid entity id");
}
}
}
| ورودی یا سناریو | خروجی نمونه | نکته |
|---|
| 6f9619ff-8b86-d011-b42d-00c04fc964ff | Valid entity id | اعتبارسنجی شناسه مسیر API |
کاربرد عملی این الگو در شناسه موجودیتها، کلیدهای عمومی API، همگامسازی توزیعشده و رهگیری درخواست دیده میشود. در نسخه تولیدی، پیام خطا، ثبت رخداد، حریم خصوصی داده و تست واحد را متناسب با قرارداد سامانه تکمیل کنید.
مثال 5: نمایش GUID قالب B
مثال «نمایش GUID قالب B» ثابت میکند خروجی فقط یک متن تغییرشکلیافته نیست و Runtime نوع واقعی مقصد را ایجاد کرده است.
using System;
public static class Program
{
public static void Main()
{
string text = "{6f9619ff-8b86-d011-b42d-00c04fc964ff}";
Guid id = Guid.Parse(text);
Console.WriteLine(id.ToString("B"));
}
}
| ورودی یا سناریو | خروجی نمونه | نکته |
|---|
| 6f9619ff-8b86-d011-b42d-00c04fc964ff | {6f9619ff-8b86-d011-b42d-00c04fc964ff} | نمایش GUID قالب B |
کاربرد عملی این الگو در شناسه موجودیتها، کلیدهای عمومی API، همگامسازی توزیعشده و رهگیری درخواست دیده میشود. در نسخه تولیدی، پیام خطا، ثبت رخداد، حریم خصوصی داده و تست واحد را متناسب با قرارداد سامانه تکمیل کنید.
مثال 6: سیاست شناسه تهی
در «سیاست شناسه تهی»، چون Parse برای null قرارداد موفقی ندارد، سیاست مقدار پیشفرض پیش از فراخوانی اعمال میشود.
using System;
public static class Program
{
public static void Main()
{
string? text = null;
Guid id = text is null ? Guid.Empty : Guid.Parse(text);
Console.WriteLine(id == Guid.Empty);
}
}
| ورودی یا سناریو | خروجی نمونه | نکته |
|---|
| 6f9619ff-8b86-d011-b42d-00c04fc964ff | True | سیاست شناسه تهی |
کاربرد عملی این الگو در شناسه موجودیتها، کلیدهای عمومی API، همگامسازی توزیعشده و رهگیری درخواست دیده میشود. در نسخه تولیدی، پیام خطا، ثبت رخداد، حریم خصوصی داده و تست واحد را متناسب با قرارداد سامانه تکمیل کنید.
مثال 7: تشخیص Guid.Empty
آزمون «تشخیص Guid.Empty» کران مهم نوع مقصد را میسنجد؛ محدوده این مقاله یکی از قالبهای معتبر GUID مانند D، N، B، P یا X است.
using System;
public static class Program
{
public static void Main()
{
string text = "00000000-0000-0000-0000-000000000000";
Guid id = Guid.Parse(text);
Console.WriteLine(id == Guid.Empty);
}
}
| ورودی یا سناریو | خروجی نمونه | نکته |
|---|
| 6f9619ff-8b86-d011-b42d-00c04fc964ff | True | تشخیص Guid.Empty |
کاربرد عملی این الگو در شناسه موجودیتها، کلیدهای عمومی API، همگامسازی توزیعشده و رهگیری درخواست دیده میشود. در نسخه تولیدی، پیام خطا، ثبت رخداد، حریم خصوصی داده و تست واحد را متناسب با قرارداد سامانه تکمیل کنید.
مثال 8: ساخت Correlation ID نوعدار
سناریوی «ساخت Correlation ID نوعدار» به یک کاربرد پروژهای در حوزه شناسه موجودیتها، کلیدهای عمومی API، همگامسازی توزیعشده و رهگیری درخواست نزدیک است و مقدار تبدیلشده را وارد منطق کسبوکار میکند.
using System;
public static class Program
{
public static void Main()
{
string correlationText = "7c9e6679-7425-40de-944b-e07fc1f90ae7";
Guid correlationId = Guid.Parse(correlationText);
Console.WriteLine($"Trace:{correlationId:N}");
}
}
| ورودی یا سناریو | خروجی نمونه | نکته |
|---|
| 6f9619ff-8b86-d011-b42d-00c04fc964ff | Trace:7c9e6679742540de944be07fc1f90ae7 | ساخت Correlation ID نوعدار |
کاربرد عملی این الگو در شناسه موجودیتها، کلیدهای عمومی API، همگامسازی توزیعشده و رهگیری درخواست دیده میشود. در نسخه تولیدی، پیام خطا، ثبت رخداد، حریم خصوصی داده و تست واحد را متناسب با قرارداد سامانه تکمیل کنید.
مثال 9: رد رشته غیر GUID
در «رد رشته غیر GUID»، FormatException یا OverflowException فقط در مرزی مدیریت میشود که امکان ارائه پیام اصلاحی وجود دارد.
using System;
public static class Program
{
public static void Main()
{
string text = "not-a-guid";
try
{
_ = Guid.Parse(text);
}
catch (FormatException)
{
Console.WriteLine("Invalid GUID");
}
}
}
| ورودی یا سناریو | خروجی نمونه | نکته |
|---|
| 6f9619ff-8b86-d011-b42d-00c04fc964ff | Invalid GUID | رد رشته غیر GUID |
کاربرد عملی این الگو در شناسه موجودیتها، کلیدهای عمومی API، همگامسازی توزیعشده و رهگیری درخواست دیده میشود. در نسخه تولیدی، پیام خطا، ثبت رخداد، حریم خصوصی داده و تست واحد را متناسب با قرارداد سامانه تکمیل کنید.
مثال 10: پردازش Span با TryParse
نمونه «پردازش Span با TryParse» از TryParse استفاده میکند تا شکست عادی بدون ساخت استثنا گزارش شود و مسیر پرترافیک خوانا بماند.
using System;
public static class Program
{
public static void Main()
{
ReadOnlySpan<char> text = "6f9619ff-8b86-d011-b42d-00c04fc964ff";
if (Guid.TryParse(text, out Guid id))
{
Console.WriteLine(id.ToString("D"));
}
}
}
| ورودی یا سناریو | خروجی نمونه | نکته |
|---|
| 6f9619ff-8b86-d011-b42d-00c04fc964ff | 6f9619ff-8b86-d011-b42d-00c04fc964ff | پردازش Span با TryParse |
کاربرد عملی این الگو در شناسه موجودیتها، کلیدهای عمومی API، همگامسازی توزیعشده و رهگیری درخواست دیده میشود. در نسخه تولیدی، پیام خطا، ثبت رخداد، حریم خصوصی داده و تست واحد را متناسب با قرارداد سامانه تکمیل کنید.
خطاهای رایج و روش اصلاح
بیشتر ایرادهای تبدیل از خود API ناشی نمیشوند؛ منشأ آنها قرارداد مبهم ورودی است. مشخص نبودن Culture، اعتماد به متن کاربر، نادیدهگرفتن محدوده نوع و استفاده از استثنا برای کنترل جریان، رفتار سامانه را غیرقابل پیشبینی میکند.
- فراخوانی Parse روی null یا رشته خالی؛ ابتدا سیاست مقدار اجباری، مقدار پیشفرض یا رد درخواست را تعیین کنید.
- تکیه بر Culture جاری سرور؛ برای داده بینسامانهای از CultureInfo.InvariantCulture یا قالب دقیق استفاده کنید.
- فرض اینکه موفقیت تبدیل یعنی اعتبار کسبوکار؛ محدوده، موجودیت و قواعد دامنه را پس از تبدیل بسنجید.
- گرفتن catch کلی و ادامه خاموش برنامه؛ فقط خطای قابل بازیابی را بگیرید و اطلاعات تشخیصی مناسب ثبت کنید.
- تبدیل چندباره همان متن در لایههای مختلف؛ یک بار در مرز تبدیل کنید و مقدار نوعدار را به داخل بفرستید.
- قرار دادن Parse در حلقهای با نرخ خطای بالا؛ در این مسیر از TryParse و پردازش نتیجه bool استفاده کنید.
کارایی، حافظه و رفتار سیستمی
برای ورودی معتبر، Guid.Parse() معمولاً عملیات کوتاهی است و مقدار مقصد را بدون نیاز به منطق پیچیده تولید میکند. با این حال هزینه واقعی به طول متن، فرهنگ، سبک عدد، نوع مقصد، نسخه Runtime، معماری CPU و نرخ شکست وابسته است.
تفاوت بزرگ زمانی دیده میشود که ورودی نامعتبر پرتکرار باشد. Parse برای گزارش شکست یک Exception میسازد و پرتاب میکند؛ این مسیر علاوه بر CPU میتواند تخصیص حافظه و فشار جمعآوری زباله ایجاد کند. TryParse شکست را با false برمیگرداند و برای داده کاربر یا فایل حجیم مناسبتر است.
در مسیرهای بسیار داغ، overloadهای مبتنی بر ReadOnlySpan میتوانند از ساخت Substring جلوگیری کنند. این به معنی سریعتر بودن قطعی در هر پروژه نیست؛ آزمون باید در Release، بدون Debugger، پس از Warm-up و با دادهای شبیه تولید انجام شود. BenchmarkDotNet برای مقایسه علمی گزینه مطمئنتری است.
بهترین روشها
- نوع مقصد را بر اساس دامنه انتخاب کنید، نه صرفاً بر اساس اینکه نمونه فعلی در آن جا میشود.
- قالب، Culture و سیاست null را بخشی از قرارداد API یا فایل بدانید.
- برای داده تضمینشده Parse و برای شکست قابل انتظار TryParse را انتخاب کنید.
- پیام خطای فارسی و قابل اقدام بسازید، اما داده محرمانه را در Log تکرار نکنید.
- پس از تبدیل، اعتبار دامنهای مانند محدوده مجاز و وجود شناسه را جداگانه کنترل کنید.
- حالتهای حداقل، حداکثر، صفر، منفی، فاصله، حروف و قالب ناسازگار را تست کنید.
- در حلقه داغ، تبدیل و ساخت CultureInfo یا Regex تکراری را حذف کنید.
- تصمیم کارایی را با پروفایل و Benchmark روی نسخه واقعی .NET تأیید کنید.
کاربرد واقعی در معماری نرمافزار
در سامانه سازمانی، Guid.Parse() بهتر است در لایه ورودی، Mapper یا Value Object قرار گیرد. رشته خام مربوط به شناسه موجودیتها، کلیدهای عمومی API، همگامسازی توزیعشده و رهگیری درخواست پس از اعتبارسنجی به مقدار نوعدار تبدیل میشود و لایه دامنه دیگر درگیر جزئیات نمایش متن نیست.
این الگو تستپذیری را افزایش میدهد، پیامهای خطا را یکپارچه میکند و مانع پخششدن منطق تبدیل در Controller، فرم و Repository میشود. برای پروژههای بزرگ میتوان نتیجه تبدیل را در یک Result type قرار داد تا خطا بدون Exception به لایه نمایش برگردد.
سؤالات متداول
۱. Guid.Parse() دقیقاً چه کاری انجام میدهد؟
Guid.Parse() نمایش متنی معتبر را مطابق قواعد نوع مقصد به یک مقدار نوعدار تبدیل میکند. نتیجه پس از تبدیل میتواند در محاسبه، شرط، ذخیرهسازی یا منطق دامنه استفاده شود و دیگر لازم نیست با رشته خام کار کنیم.
۲. چه زمانی استفاده از Guid.Parse() برای تازهکاران مناسب است؟
وقتی منبع داده مورد اعتماد است، قالب از قبل اعتبارسنجی شده و شکست واقعاً یک وضعیت استثنایی محسوب میشود، Parse انتخابی ساده و خواناست. برای ورودی مستقیم کاربر معمولاً TryParse تجربه مقاومتری ایجاد میکند.
۳. آیا استفاده درست از Guid.Parse() هزینه نگهداری پروژه را کم میکند؟
بله؛ تبدیل در مرز سیستم و انتقال مقدار نوعدار به لایههای داخلی، شرطهای تکراری و خطاهای پنهان را کاهش میدهد. این جداسازی در پروژههای تجاری، گزارشگیری و سامانههای چندلایه ارزش زیادی دارد.
۴. در پروژه سفارشی چگونه سیاست تبدیل Guid.Parse() طراحی میشود؟
قالب ورودی، فرهنگ، رفتار null، محدوده مجاز، پیام خطا و محل ثبت رخداد باید در قرارداد ورودی مشخص شوند. سپس تبدیل در یک نقطه مشترک مانند Validator، Mapper یا لایه ورودی پیادهسازی و با تست پوشش داده میشود.
۵. تفاوت کلیدی Parse و TryParse برای Guid.Parse() چیست؟
Parse در شکست استثنا پرتاب میکند، ولی TryParse با یک مقدار bool موفقیت را گزارش میدهد و خروجی را از پارامتر out تحویل میدهد. تفاوت اصلی در قرارداد شکست است، نه صرفاً شکل نوشتن کد.
۶. برای پیادهسازی حرفهای Guid.Parse() چه خدماتی لازم میشود؟
در سامانه حساس میتوان از بازبینی قرارداد داده، طراحی اعتبارسنجی، تست دادههای مرزی، پروفایل کارایی و ثبت خطای ساختیافته استفاده کرد. مشاوره فنی کمک میکند این تصمیمها با معماری و نیاز واقعی محصول هماهنگ شوند.
۷. خطاهای رایج Guid.Parse() کداماند؟
ارسال null، رشته خالی، قالب ناسازگار، عدد خارج از محدوده، فرهنگ اشتباه و گرفتن کلی همه Exceptionها از خطاهای پرتکرار هستند. ثبت مقدار حساس نیز باید با قواعد امنیت و حریم خصوصی هماهنگ شود.
۸. آیا Guid.Parse() از نظر Performance کند است؟
روی ورودی معتبر معمولاً تبدیل سریع است؛ مشکل اصلی زمانی رخ میدهد که داده نامعتبر زیاد باشد و Parse مرتب استثنا بسازد. اندازهگیری با داده واقعی، Release build، Runtime هدف و ابزار مناسب از حدس بهتر است.
۹. بهترین روش استفاده از Guid.Parse() چیست؟
فرهنگ و قالب را صریح کنید، تبدیل را در مرز ورودی نگه دارید، دامنه مجاز را جداگانه بسنجید، از تبدیل تکراری جلوگیری کنید و برای تمام کرانها تست داشته باشید. شکست قابل انتظار را نیز با TryParse مدل کنید.
۱۰. Guid.Parse() با کدام نسخههای C# و .NET سازگار است؟
شکلهای پایه Parse سالهاست در .NET وجود دارند، اما overloadهای Generic، Span و رابطهای جدید مانند IParsable به نسخه Runtime وابستهاند. پیش از استفاده از overload جدید، Target Framework پروژه و مستندات همان نسخه را کنترل کنید.