آموزش جامع Parse و TryParse در C# و .NET با ۱۲ راهنمای تخصصی

راهنمای جامع متدهای Parse در C# و .NET؛ تبدیل متن، خطا و Performance

توسط admin | گروه SQL Server | 1405/05/01

نظرات 0

راهنمای جامع متدهای Parse در C# و .NET؛ از تبدیل متن تا تحلیل کارایی

مقدمه و نقشه راه

بخش بزرگی از داده‌های واقعی به شکل متن وارد نرم‌افزار می‌شود: مقدار یک TextBox، آرگومان خط فرمان، ستون CSV، متغیر محیطی، پارامتر مسیر API یا تنظیمات برنامه. هسته برنامه اما برای محاسبه و تصمیم‌گیری به bool، عدد، تاریخ، Guid و Enum نیاز دارد. خانواده Parse پل میان نمایش متنی و مدل نوع‌دار .NET است.

انتخاب درست فقط به نوشتن یک فراخوانی ختم نمی‌شود. باید بدانیم چه کسی اعتبار ورودی را تضمین می‌کند، جداکننده اعشار متعلق به کدام Culture است، null چه معنایی دارد، مقدار مقصد چه محدوده‌ای دارد و آیا شکست باید Exception باشد یا یک نتیجه عادی. این تصمیم‌ها مستقیماً بر درستی، امنیت، نگهداری و Performance اثر می‌گذارند.

این مقاله مادر همه تبدیل‌های اصلی را در یک نقشه منظم جمع می‌کند. هر مورد معرفی کوتاه و لینک آموزش مستقل دارد؛ سپس شش برنامه کامل، مقایسه Parse و TryParse، رفتار حافظه، نقش Span، الگوی معماری، خطاهای رایج، FAQ و سؤالات مصاحبه ارائه می‌شود.

دسترسی سریع به مقاله‌های تخصصی

1خانواده Parse در CC# Parse

تصویر 1: خانواده Parse در C# و .NET؛ نقشه تبدیل رشته به انواع نوع‌دار

Parse چگونه در Runtime کار می‌کند؟

هر نوع قواعد نحوی خودش را اجرا می‌کند. نوع‌های عددی علائم، رقم‌ها، ممیز، نما و محدوده را می‌سنجند؛ DateTime قالب و Culture را تفسیر می‌کند؛ Guid ساختار شناسه را بررسی می‌کند؛ Enum نام یا مقدار عددی را به عضو شمارشی نگاشت می‌دهد. خروجی یک مقدار واقعی از نوع مقصد است، نه رشته‌ای با ظاهر متفاوت.

در مسیر موفق، Parser متن را پیمایش می‌کند، رقم یا نشانه‌ها را تفسیر می‌کند و مقدار مقصد را می‌سازد. در مسیر شکست Parse باید Exception مناسب را ایجاد و پرتاب کند. TryParse معمولاً همان منطق تبدیل را با قرارداد نتیجه bool ارائه می‌دهد و از ساخت Exception برای شکست قابل انتظار دوری می‌کند.

نوع‌های مقداری مانند int و Guid پس از تبدیل در متغیر محلی بدون Boxing نگهداری می‌شوند، مگر اینکه آن‌ها را به object یا رابط ناسازگار تبدیل کنیم. خود رشته ورودی از قبل روی Heap قرار دارد. استفاده از ReadOnlySpan در برخی overloadها می‌تواند نیاز به ساخت رشته فرعی را حذف کند و در پردازش‌های حجیم تخصیص را کاهش دهد.

سه لایه اعتبار: قالب، محدوده و دامنه

اعتبار قالب پاسخ می‌دهد آیا متن از نظر نحوی قابل تبدیل است. اعتبار محدوده بررسی می‌کند مقدار در ظرفیت نوع مقصد جا می‌شود یا نه. اعتبار دامنه می‌پرسد آیا آن مقدار برای کسب‌وکار مجاز است. برای مثال int.Parse روی متن منفی موفق می‌شود، اما تعداد کالای منفی در سامانه فروش معتبر نیست.

جداکردن این سه لایه پیام خطای دقیق‌تری می‌سازد و تست‌ها را ساده می‌کند. Parser نباید مسئول یافتن مشتری در پایگاه داده یا بررسی مجوز باشد. وظیفه آن تبدیل نحوی است؛ Validation دامنه در مرحله بعد و در محل مناسب معماری انجام می‌شود.

bool.Parse()؛ تبدیل متن به مقدار منطقی

bool.Parse() برای فعال یا غیرفعال‌کردن قابلیت‌ها، خواندن تنظیمات و پردازش پاسخ‌های منطقی مناسب است. محدوده یا قرارداد مهم آن فقط رشته‌های True و False، بدون حساسیت به بزرگی حروف است. در داده تضمین‌شده Parse خواناست؛ در ورودی نامطمئن باید TryParse، اعتبارسنجی دامنه و پیام خطای مناسب را در نظر گرفت.

آموزش کامل bool.Parse() با مثال‌های اجرایی، خروجی و نکات Performance جزئیات Syntax، پارامترها، خطاهای مرزی، ده مثال مستقل و پرسش‌های متداول این موضوع را پوشش می‌دهد.

byte.Parse()؛ تبدیل متن به عدد بدون علامت هشت‌بیتی

byte.Parse() برای کانال‌های رنگ، داده باینری، درصدهای کوچک و مقادیر محدود صفر تا ۲۵۵ مناسب است. محدوده یا قرارداد مهم آن از 0 تا 255 است. در داده تضمین‌شده Parse خواناست؛ در ورودی نامطمئن باید TryParse، اعتبارسنجی دامنه و پیام خطای مناسب را در نظر گرفت.

آموزش کامل byte.Parse() با مثال‌های اجرایی، خروجی و نکات Performance جزئیات Syntax، پارامترها، خطاهای مرزی، ده مثال مستقل و پرسش‌های متداول این موضوع را پوشش می‌دهد.

short.Parse()؛ تبدیل متن به عدد صحیح شانزده‌بیتی

short.Parse() برای داده‌های فشرده، اندازه‌گیری‌های کوچک، کدهای قدیمی و انتقال داده کم‌حجم مناسب است. محدوده یا قرارداد مهم آن از ‎-32768 تا 32767 است. در داده تضمین‌شده Parse خواناست؛ در ورودی نامطمئن باید TryParse، اعتبارسنجی دامنه و پیام خطای مناسب را در نظر گرفت.

آموزش کامل short.Parse() با مثال‌های اجرایی، خروجی و نکات Performance جزئیات Syntax، پارامترها، خطاهای مرزی، ده مثال مستقل و پرسش‌های متداول این موضوع را پوشش می‌دهد.

int.Parse()؛ تبدیل متن به عدد صحیح سی‌ودوبیتی

int.Parse() برای شناسه‌ها، شمارنده‌ها، تعداد کالا، شماره صفحه و اغلب ورودی‌های عدد صحیح مناسب است. محدوده یا قرارداد مهم آن از ‎-2147483648 تا 2147483647 است. در داده تضمین‌شده Parse خواناست؛ در ورودی نامطمئن باید TryParse، اعتبارسنجی دامنه و پیام خطای مناسب را در نظر گرفت.

آموزش کامل int.Parse() با مثال‌های اجرایی، خروجی و نکات Performance جزئیات Syntax، پارامترها، خطاهای مرزی، ده مثال مستقل و پرسش‌های متداول این موضوع را پوشش می‌دهد.

long.Parse()؛ تبدیل متن به عدد صحیح شصت‌وچهاربیتی

long.Parse() برای شناسه‌های بزرگ، اندازه فایل، شمارنده‌های طولانی، Tick و داده‌های مقیاس بالا مناسب است. محدوده یا قرارداد مهم آن عدد صحیح علامت‌دار 64 بیتی است. در داده تضمین‌شده Parse خواناست؛ در ورودی نامطمئن باید TryParse، اعتبارسنجی دامنه و پیام خطای مناسب را در نظر گرفت.

آموزش کامل long.Parse() با مثال‌های اجرایی، خروجی و نکات Performance جزئیات Syntax، پارامترها، خطاهای مرزی، ده مثال مستقل و پرسش‌های متداول این موضوع را پوشش می‌دهد.

float.Parse()؛ تبدیل متن به عدد اعشاری تک‌دقت

float.Parse() برای گرافیک، حسگرها و محاسباتی که سرعت و حافظه از دقت اعشاری مالی مهم‌تر است مناسب است. محدوده یا قرارداد مهم آن ممیز شناور 32 بیتی با حدود 7 رقم دقت است. در داده تضمین‌شده Parse خواناست؛ در ورودی نامطمئن باید TryParse، اعتبارسنجی دامنه و پیام خطای مناسب را در نظر گرفت.

آموزش کامل float.Parse() با مثال‌های اجرایی، خروجی و نکات Performance جزئیات Syntax، پارامترها، خطاهای مرزی، ده مثال مستقل و پرسش‌های متداول این موضوع را پوشش می‌دهد.

double.Parse()؛ تبدیل متن به عدد اعشاری دودقت

double.Parse() برای محاسبات علمی، آماری، مختصات، تحلیل داده و مقادیر اعشاری عمومی مناسب است. محدوده یا قرارداد مهم آن ممیز شناور 64 بیتی با حدود 15 تا 17 رقم دقت است. در داده تضمین‌شده Parse خواناست؛ در ورودی نامطمئن باید TryParse، اعتبارسنجی دامنه و پیام خطای مناسب را در نظر گرفت.

آموزش کامل double.Parse() با مثال‌های اجرایی، خروجی و نکات Performance جزئیات Syntax، پارامترها، خطاهای مرزی، ده مثال مستقل و پرسش‌های متداول این موضوع را پوشش می‌دهد.

decimal.Parse()؛ تبدیل متن به عدد اعشاری دقیق

decimal.Parse() برای پول، مالیات، حسابداری، قیمت‌گذاری و محاسباتی که دقت ده‌دهی قطعی لازم دارند مناسب است. محدوده یا قرارداد مهم آن عدد ده‌دهی 128 بیتی با 28 تا 29 رقم معنی‌دار است. در داده تضمین‌شده Parse خواناست؛ در ورودی نامطمئن باید TryParse، اعتبارسنجی دامنه و پیام خطای مناسب را در نظر گرفت.

آموزش کامل decimal.Parse() با مثال‌های اجرایی، خروجی و نکات Performance جزئیات Syntax، پارامترها، خطاهای مرزی، ده مثال مستقل و پرسش‌های متداول این موضوع را پوشش می‌دهد.

DateTime.Parse()؛ تبدیل متن به تاریخ و زمان

DateTime.Parse() برای زمان‌بندی، ثبت رویداد، گزارش‌های دوره‌ای، تاریخ ورود و داده‌های بین‌سامانه‌ای مناسب است. محدوده یا قرارداد مهم آن تاریخ و زمان معتبر در محدوده نوع DateTime است. در داده تضمین‌شده Parse خواناست؛ در ورودی نامطمئن باید TryParse، اعتبارسنجی دامنه و پیام خطای مناسب را در نظر گرفت.

آموزش کامل DateTime.Parse() با مثال‌های اجرایی، خروجی و نکات Performance جزئیات Syntax، پارامترها، خطاهای مرزی، ده مثال مستقل و پرسش‌های متداول این موضوع را پوشش می‌دهد.

Guid.Parse()؛ تبدیل متن به شناسه یکتای سراسری

Guid.Parse() برای شناسه موجودیت‌ها، کلیدهای عمومی API، همگام‌سازی توزیع‌شده و رهگیری درخواست مناسب است. محدوده یا قرارداد مهم آن یکی از قالب‌های معتبر GUID مانند D، N، B، P یا X است. در داده تضمین‌شده Parse خواناست؛ در ورودی نامطمئن باید TryParse، اعتبارسنجی دامنه و پیام خطای مناسب را در نظر گرفت.

آموزش کامل Guid.Parse() با مثال‌های اجرایی، خروجی و نکات Performance جزئیات Syntax، پارامترها، خطاهای مرزی، ده مثال مستقل و پرسش‌های متداول این موضوع را پوشش می‌دهد.

Enum.Parse()؛ تبدیل متن به مقدار شمارشی

Enum.Parse() برای وضعیت سفارش، نقش کاربر، سطح دسترسی، نوع عملیات و تنظیمات دامنه‌ای خوانا مناسب است. محدوده یا قرارداد مهم آن نام یا مقدار عددی سازگار با نوع Enum هدف است. در داده تضمین‌شده Parse خواناست؛ در ورودی نامطمئن باید TryParse، اعتبارسنجی دامنه و پیام خطای مناسب را در نظر گرفت.

آموزش کامل Enum.Parse() با مثال‌های اجرایی، خروجی و نکات Performance جزئیات Syntax، پارامترها، خطاهای مرزی، ده مثال مستقل و پرسش‌های متداول این موضوع را پوشش می‌دهد.

Parse و TryParse از دید کارایی و حافظه؛ تحلیل سیستمی Parse و TryParse

Parse و TryParse از دید کارایی و حافظه برای مسیرهای پرترافیک، ورودی کاربر، فایل‌های حجیم، APIها و پردازش دسته‌ای مناسب است. محدوده یا قرارداد مهم آن وابسته به نوع مقصد و نرخ داده نامعتبر است. در داده تضمین‌شده Parse خواناست؛ در ورودی نامطمئن باید TryParse، اعتبارسنجی دامنه و پیام خطای مناسب را در نظر گرفت.

آموزش کامل Parse و TryParse از دید کارایی و حافظه با مثال‌های اجرایی، خروجی و نکات Performance جزئیات Syntax، پارامترها، خطاهای مرزی، ده مثال مستقل و پرسش‌های متداول این موضوع را پوشش می‌دهد.

جدول مقایسه‌ای متدها

متد یا موضوعکاربرد اصلیخروجی یا نکته مهملینک آموزش کامل
bool.Parse()تبدیل متن به مقدار منطقیفقط رشته‌های True و False، بدون حساسیت به بزرگی حروفمطالعه آموزش bool.Parse()
byte.Parse()تبدیل متن به عدد بدون علامت هشت‌بیتیاز 0 تا 255مطالعه آموزش byte.Parse()
short.Parse()تبدیل متن به عدد صحیح شانزده‌بیتیاز ‎-32768 تا 32767مطالعه آموزش short.Parse()
int.Parse()تبدیل متن به عدد صحیح سی‌ودوبیتیاز ‎-2147483648 تا 2147483647مطالعه آموزش int.Parse()
long.Parse()تبدیل متن به عدد صحیح شصت‌وچهاربیتیعدد صحیح علامت‌دار 64 بیتیمطالعه آموزش long.Parse()
float.Parse()تبدیل متن به عدد اعشاری تک‌دقتممیز شناور 32 بیتی با حدود 7 رقم دقتمطالعه آموزش float.Parse()
double.Parse()تبدیل متن به عدد اعشاری دودقتممیز شناور 64 بیتی با حدود 15 تا 17 رقم دقتمطالعه آموزش double.Parse()
decimal.Parse()تبدیل متن به عدد اعشاری دقیقعدد ده‌دهی 128 بیتی با 28 تا 29 رقم معنی‌دارمطالعه آموزش decimal.Parse()
DateTime.Parse()تبدیل متن به تاریخ و زمانتاریخ و زمان معتبر در محدوده نوع DateTimeمطالعه آموزش DateTime.Parse()
Guid.Parse()تبدیل متن به شناسه یکتای سراسرییکی از قالب‌های معتبر GUID مانند D، N، B، P یا Xمطالعه آموزش Guid.Parse()
Enum.Parse()تبدیل متن به مقدار شمارشینام یا مقدار عددی سازگار با نوع Enum هدفمطالعه آموزش Enum.Parse()
Parse و TryParse از دید کارایی و حافظهتحلیل سیستمی Parse و TryParseوابسته به نوع مقصد و نرخ داده نامعتبرمطالعه آموزش Parse و TryParse از دید کارایی و حافظه
2انتخاب Parse یا TrC# Parse

تصویر 2: انتخاب Parse یا TryParse؛ قرارداد شکست مهم‌تر از کوتاهی کد است

شش مثال ترکیبی و قابل اجرا

نمونه‌های این بخش الگوهای مشترک را نشان می‌دهند: داده تضمین‌شده، ورودی کاربر، فرهنگ ثابت، زمان استاندارد، شناسه API و Enum. در هر پروژه باید مقادیر مرزی و پیام‌های خطا با قرارداد همان دامنه جایگزین شوند.

مثال 1: تبدیل داده تضمین‌شده با int.Parse

مقدار از تنظیمات کنترل‌شده برنامه می‌آید، بنابراین شکست به معنی خرابی پیکربندی است و Parse قرارداد را شفاف نگه می‌دارد.

using System;
    
    public static class Program
    {
        public static void Main()
        {
            const string configuredPort = "8080";
            int port = int.Parse(configuredPort);
            Console.WriteLine(port);
        }
    }
سناریوخروجی نمونهاصل طراحی
تبدیل داده تضمین‌شده با int.Parse8080تبدیل در مرز و انتقال مقدار نوع‌دار

این نمونه کوچک عمداً منطق تبدیل را از منطق اصلی جدا نگه می‌دارد. در محصول واقعی، تست واحد، ثبت خطا، محدودیت امنیتی و قرارداد API را نیز اضافه کنید.

مثال 2: اعتبارسنجی ورودی کاربر با TryParse

متن کاربر ممکن است نامعتبر باشد؛ نتیجه bool بدون هزینه استثنا مسیر خطا را به شکل عادی مدل می‌کند.

using System;
    
    public static class Program
    {
        public static void Main()
        {
            string userText = "42";
            if (int.TryParse(userText, out int age))
            {
                Console.WriteLine($"Age={age}");
            }
            else
            {
                Console.WriteLine("Invalid age");
            }
        }
    }
سناریوخروجی نمونهاصل طراحی
اعتبارسنجی ورودی کاربر با TryParseAge=42تبدیل در مرز و انتقال مقدار نوع‌دار

این نمونه کوچک عمداً منطق تبدیل را از منطق اصلی جدا نگه می‌دارد. در محصول واقعی، تست واحد، ثبت خطا، محدودیت امنیتی و قرارداد API را نیز اضافه کنید.

مثال 3: عدد اعشاری پایدار بین سرویس‌ها

داده JSON یا فایل مبادله‌ای باید مستقل از زبان سرور تفسیر شود؛ فرهنگ ثابت مانع جابه‌جایی ممیز و هزارگان می‌شود.

using System;
    using System.Globalization;
    
    public static class Program
    {
        public static void Main()
        {
            string text = "1250.75";
            decimal amount = decimal.Parse(text, System.Globalization.CultureInfo.InvariantCulture);
            Console.WriteLine(amount.ToString(System.Globalization.CultureInfo.InvariantCulture));
        }
    }
سناریوخروجی نمونهاصل طراحی
عدد اعشاری پایدار بین سرویس‌ها1250.75تبدیل در مرز و انتقال مقدار نوع‌دار

این نمونه کوچک عمداً منطق تبدیل را از منطق اصلی جدا نگه می‌دارد. در محصول واقعی، تست واحد، ثبت خطا، محدودیت امنیتی و قرارداد API را نیز اضافه کنید.

مثال 4: تاریخ ISO با حفظ Kind

قالب ISO 8601 برای تبادل بین سامانه‌ها مناسب است و RoundtripKind اطلاعات UTC را حفظ می‌کند.

using System;
    using System.Globalization;
    
    public static class Program
    {
        public static void Main()
        {
            string text = "2026-07-23T09:30:00Z";
            DateTime timestamp = DateTime.Parse(text, null, System.Globalization.DateTimeStyles.RoundtripKind);
            Console.WriteLine($"{timestamp:O}; Kind={timestamp.Kind}");
        }
    }
سناریوخروجی نمونهاصل طراحی
تاریخ ISO با حفظ KindKind=Utcتبدیل در مرز و انتقال مقدار نوع‌دار

این نمونه کوچک عمداً منطق تبدیل را از منطق اصلی جدا نگه می‌دارد. در محصول واقعی، تست واحد، ثبت خطا، محدودیت امنیتی و قرارداد API را نیز اضافه کنید.

مثال 5: اعتبار GUID در مسیر API

شناسه مسیر عمومی است و نامعتبر بودن آن قابل انتظار؛ TryParse پیش از مراجعه به پایگاه داده درخواست را رد می‌کند.

using System;
    
    public static class Program
    {
        public static void Main()
        {
            string routeId = "6f9619ff-8b86-d011-b42d-00c04fc964ff";
            if (Guid.TryParse(routeId, out Guid id) && id != Guid.Empty)
            {
                Console.WriteLine(id.ToString("N"));
            }
        }
    }
سناریوخروجی نمونهاصل طراحی
اعتبار GUID در مسیر API6f9619ff8b86d011b42d00c04fc964ffتبدیل در مرز و انتقال مقدار نوع‌دار

این نمونه کوچک عمداً منطق تبدیل را از منطق اصلی جدا نگه می‌دارد. در محصول واقعی، تست واحد، ثبت خطا، محدودیت امنیتی و قرارداد API را نیز اضافه کنید.

مثال 6: تبدیل Enum همراه کنترل دامنه

Parse عددی ممکن است مقداری تعریف‌نشده بسازد؛ ترکیب 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 = "Processing";
            if (Enum.TryParse(text, true, out OrderStatus status)
                && Enum.IsDefined(status))
            {
                Console.WriteLine(status);
            }
        }
    }
سناریوخروجی نمونهاصل طراحی
تبدیل Enum همراه کنترل دامنهProcessingتبدیل در مرز و انتقال مقدار نوع‌دار

این نمونه کوچک عمداً منطق تبدیل را از منطق اصلی جدا نگه می‌دارد. در محصول واقعی، تست واحد، ثبت خطا، محدودیت امنیتی و قرارداد API را نیز اضافه کنید.

Parse در برابر TryParse

اگر متن طبق قرارداد داخلی حتماً معتبر است، Parse قصد برنامه‌نویس را روشن می‌کند: شکست یک وضعیت غیرعادی و نشانه خرابی داده یا پیکربندی است. اگر متن از کاربر، شبکه یا فایل خارجی می‌آید، نامعتبر بودن بخشی طبیعی از جریان است و TryParse نتیجه‌ای قابل مدیریت می‌دهد.

استفاده همیشگی از یکی از این دو API قاعده حرفه‌ای نیست. Parse می‌تواند خطای پنهان قرارداد داخلی را زود آشکار کند و TryParse می‌تواند مسیر پرترافیک نامعتبر را بدون هزینه استثنا مدیریت نماید. معیار، احتمال شکست و معنای شکست است.

تحلیل Performance و مصرف حافظه

روی ورودی معتبر، Parse و TryParse اغلب بخش بزرگی از منطق اسکن و تبدیل را مشترک دارند؛ بنابراین اختلاف باید اندازه‌گیری شود. در ورودی نامعتبر، Parse علاوه بر تشخیص خطا، Exception می‌سازد و Stack را برای پرتاب مدیریت می‌کند. تکرار این مسیر در حلقه می‌تواند CPU، Allocation و فشار GC را بالا ببرد.

برای سنجش درست، برنامه را در حالت Release و بدون Debugger اجرا کنید، کد را Warm-up کنید، ورودی واقعی و نرخ خطای واقعی داشته باشید و چند دور مستقل بسنجید. Stopwatch برای مشاهده اولیه مناسب است، ولی BenchmarkDotNet فرآیند JIT، چند دور، انحراف و تشخیص تخصیص را علمی‌تر مدیریت می‌کند.

GetAllocatedBytesForCurrentThread می‌تواند تغییر تخصیص همان Thread را نشان دهد، اما نتیجه به Runtime و کد پیرامونی حساس است. ساخت Substring، پیام خطا یا آرایه موقت را با هزینه خود Parse مخلوط نکنید. برای فایل بزرگ، Span و پردازش Streaming ممکن است اثری بزرگ‌تر از تغییر Parse به TryParse داشته باشند.

Culture، قالب و داده بین‌سامانه‌ای

رشته 1,234 در یک فرهنگ ممکن است عدد هزارودویست‌وسی‌وچهار و در فرهنگ دیگر یک عدد اعشاری باشد. تاریخ 03/04/2026 نیز بدون قرارداد دو معنا دارد. برای نمایش کاربر از Culture او و برای پروتکل، فایل مبادله‌ای و ذخیره‌سازی از قالب استاندارد و فرهنگ ثابت استفاده کنید.

برای تاریخ‌های قراردادی ParseExact یا TryParseExact، برای اعداد NumberStyles و CultureInfo، و برای Guid قالب مشخص D یا N خوانایی بیشتری ایجاد می‌کنند. صریح‌بودن قرارداد از خطایی جلوگیری می‌کند که فقط پس از انتقال نرم‌افزار به سروری با Region متفاوت دیده می‌شود.

الگوی معماری پیشنهادی

رشته خام را در Controller، UI، Importer یا Adapter دریافت کنید؛ آن را با قرارداد مشخص تبدیل کنید؛ خطای قابل اقدام بسازید؛ سپس فقط مقدار نوع‌دار را به Application و Domain بفرستید. این مرزبندی از تبدیل‌های تکراری در Repository و Service جلوگیری می‌کند.

در پروژه بزرگ می‌توان Value Object یا Result type ساخت تا مقدار معتبر و مجموعه خطاها را حمل کند. این الگو برای فرم چندفیلدی بهتر از پرتاب اولین Exception است، اما خرابی پیکربندی داخلی همچنان می‌تواند با Exception متوقف شود. یک سیاست واحد برای همه منابع داده لزوماً صحیح نیست.

خطاهای رایج

  • استفاده از Parse برای هر ورودی کاربر و تکیه بر catch به‌عنوان اعتبارسنجی عادی.
  • استفاده از TryParse برای پنهان‌کردن خرابی داده داخلی و ادامه با مقدار صفر.
  • نادیده‌گرفتن Culture در اعداد اعشاری و تاریخ‌های محلی.
  • انتخاب نوع کوچک فقط برای صرفه‌جویی فرضی و ایجاد Overflow در رشد آینده.
  • اعتبار دانستن Enum عددی بدون Enum.IsDefined یا قواعد Flags.
  • ثبت کامل داده حساس در پیام خطا یا Log.
  • تبدیل چندباره یک متن در لایه‌های گوناگون.
  • Benchmark در Debug، با یک دور و داده غیرواقعی.

بهترین روش‌ها

  • قرارداد قالب، Culture، null و محدوده را مستند کنید.
  • تبدیل را نزدیک مرز ورودی و فقط یک بار انجام دهید.
  • Parse را برای داده تضمین‌شده و TryParse را برای شکست قابل انتظار انتخاب کنید.
  • پس از تبدیل، قواعد دامنه را مستقل بررسی کنید.
  • برای پروتکل‌ها از ISO 8601 و InvariantCulture استفاده کنید.
  • مقادیر مرزی، فاصله، علامت، رشته خالی و داده بسیار بلند را تست کنید.
  • در مسیر داغ، تخصیص رشته فرعی و نرخ Exception را اندازه بگیرید.
  • برای تصمیم Performance از BenchmarkDotNet و پروفایلر حافظه کمک بگیرید.
  • پیام خطا را قابل فهم و بدون افشای داده حساس تولید کنید.
  • Target Framework و overloadهای در دسترس همان نسخه .NET را کنترل کنید.

سؤالات متداول

۱. خانواده Parse چه مسئله‌ای را حل می‌کند؟

Parse نمایش متنی را به مقدار نوع‌دار تبدیل می‌کند تا منطق برنامه با bool، عدد، تاریخ، Guid یا Enum کار کند. این تبدیل باید در مرز سیستم و زیر یک قرارداد روشن انجام شود.

۲. آیا Parse همیشه از Convert بهتر است؟

خیر. Parse روی قرارداد متنی نوع مقصد متمرکز است، در حالی که Convert ورودی‌های گوناگون و رفتار متفاوتی برای null دارد. انتخاب باید بر اساس نوع منبع و رفتار شکست باشد.

۳. چرا TryParse برای فرم‌ها پیشنهاد می‌شود؟

نامعتبر بودن ورودی کاربر طبیعی است. TryParse بدون Exception موفقیت را گزارش می‌کند و اجازه می‌دهد پیام خطا در کنار همان فیلد نمایش داده شود.

۴. آیا Parse برای پروژه تجاری امن است؟

خود تبدیل کافی نیست. محدودیت طول، فرهنگ، دامنه مجاز، نرخ درخواست، ثبت امن خطا و جلوگیری از اتکای مستقیم به متن باید در طراحی ورودی لحاظ شوند.

۵. تفاوت اصلی Parse و TryParse چیست؟

Parse شکست را با Exception و TryParse با false اعلام می‌کند. در مسیر موفق ممکن است عملکرد نزدیک باشد؛ تفاوت مهم در معنای شکست و هزینه مسیر نامعتبر است.

۶. در پروژه سفارشی سیاست تبدیل را کجا قرار دهیم؟

معمولاً در DTO mapping، Validator، Value Object یا Adapter ورودی. هدف این است که رشته خام وارد هسته دامنه نشود و قواعد در چند لایه تکرار نگردند.

۷. رایج‌ترین علت خطا چیست؟

فرهنگ نامشخص، null، رشته خالی، قالب متفاوت، Overflow و فرض اعتبار دامنه پس از موفقیت تبدیل از علت‌های پرتکرار هستند.

۸. چگونه Performance را دقیق بسنجیم؟

Release build، Warm-up، چند دور، داده واقعی و نرخ خطای واقعی لازم است. BenchmarkDotNet و ابزارهای تخصیص حافظه نتیجه قابل اعتماد‌تری از Stopwatch تک‌مرحله‌ای می‌دهند.

۹. بهترین قرارداد برای API چیست؟

فرمت‌های استاندارد و بدون ابهام مانند ISO 8601، GUID قالب D و اعداد با InvariantCulture مناسب‌اند. پاسخ خطا باید دقیق، ثابت و قابل پردازش باشد.

۱۰. قابلیت‌های جدید .NET چه کمکی می‌کنند؟

overloadهای Span، رابط‌های IParsable و ISpanParsable و Generic math امکان ساخت تبدیل‌های عمومی و کم‌تخصیص را فراهم می‌کنند؛ دسترسی آن‌ها به Target Framework وابسته است.

سؤالات مصاحبه

سؤالپاسخ مورد انتظار
چرا Exception برای اعتبارسنجی پرتکرار مناسب نیست؟هزینه مسیر شکست و مبهم‌شدن کنترل جریان
Parse و TryParse در مسیر موفق چه شباهتی دارند؟استفاده از منطق پایه تبدیل نوع
چرا int.Parse موفق، اعتبار تعداد کالا را ثابت نمی‌کند؟تفکیک اعتبار نحوی از قواعد دامنه
InvariantCulture چه زمانی لازم است؟پروتکل و داده بین‌سامانه‌ای پایدار
Span چه تخصیصی را می‌تواند حذف کند؟ساخت رشته فرعی برای بخشی از ورودی

چک‌لیست انتخاب متد

پرسشاگر پاسخ بله است
آیا ورودی طبق قرارداد داخلی حتماً معتبر است؟Parse انتخابی روشن است
آیا نامعتبر بودن بخشی طبیعی از جریان است؟TryParse را ترجیح دهید
آیا تاریخ یا عدد بین سامانه‌ها مبادله می‌شود؟قالب و Culture را صریح کنید
آیا پردازش در حلقه بزرگ انجام می‌شود؟Span، Allocation و نرخ خطا را بسنجید
آیا مقدار پس از تبدیل محدودیت کسب‌وکار دارد؟Validation دامنه را جدا اجرا کنید
3چک‌لیست نهایی ParsC# Parse

تصویر 3: چک‌لیست نهایی Parse؛ درستی، خوانایی و کارایی را هم‌زمان بسنجید

جمع‌بندی و ادامه مطالعه

Parse ابزاری کوچک با اثر معماری بزرگ است. وقتی قرارداد ورودی قطعی است، شکست سریع و روشن آن ارزشمند است؛ وقتی شکست عادی است، TryParse کد مقاوم‌تر و مسیر نامعتبر کم‌هزینه‌تری می‌سازد. نوع مقصد، فرهنگ، اعتبار دامنه و محل تبدیل باید آگاهانه انتخاب شوند.

برای ادامه، مقاله تخصصی هر نوع را از فهرست زیر باز کنید. هر راهنما شامل ده برنامه کامل، خروجی نمونه، خطاهای رایج، Performance، Best Practice، FAQ و سؤالات مصاحبه است.

 

0 نظر

نظر محترم شما در مورد مقاله های وب سایت برنامه نویسی و پایگاه داده

نظرات محترم شما در خدمات رسانی بهتر ما را یاری می نمایند. لطفا اگر مایل بودید یک نظر ما را مهمان فرمائید. آدرس ایمیل و وب سایت شما نمایش داده نخواهد شد.

حرف 500 حداکثر