آموزش long.Parse() در C# و .NET با ۱۰ مثال عملی

آموزش کامل long.Parse() در C# و .NET؛ مثال، خطا و Performance

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

نظرات 0

آموزش کامل long.Parse() در C# و .NET

مقدمه

long.Parse() یکی از ابزارهای مستقیم تبدیل متن در پلتفرم Microsoft .NET است. این API در حوزه‌هایی مانند شناسه‌های بزرگ، اندازه فایل، شمارنده‌های طولانی، Tick و داده‌های مقیاس بالا کاربرد دارد. هدف آن این است که نمایش متنی معتبر را به نوع مقصد تبدیل کند و در صورت نقض قرارداد، شکست را با استثنا اعلام نماید.

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

اگر به نمای کلی خانواده تبدیل‌ها و مسیر یادگیری همه نوع‌ها نیاز دارید، راهنمای جامع متدهای Parse در C# و .NET را نیز مطالعه کنید. لینک‌های این مجموعه مستقل از دامنه ساخته شده‌اند تا پس از جابه‌جایی وب‌سایت هم سالم بمانند.

1long.ParseC# Parse

تصویر 1: long.Parse()؛ نمای مفهومی مسیر متن تا مقدار نوع‌دار

تعریف، Syntax و قرارداد متد

در ساده‌ترین حالت، long.Parse() یک رشته را دریافت می‌کند و مقدار long تحویل می‌دهد. محدوده یا قالب اصلی این نوع عبارت است از: عدد صحیح علامت‌دار 64 بیتی. موفقیت تبدیل فقط درست‌بودن قالب را ثابت می‌کند؛ قواعد دامنه مانند مثبت‌بودن مبلغ یا تعریف‌شدن مقدار Enum باید جداگانه کنترل شوند.

Syntax پایه و قابل اجرا

using System;
    
    public static class Program
    {
        public static void Main()
        {
            string text = "9876543210";
            long value = long.Parse(text);
            Console.WriteLine(value);
        }
    }

پارامترها و نوع خروجی

  • پارامتر اصلی، متن ورودی است و نباید بدون قرارداد مشخص از لایه نمایش به هسته دامنه عبور کند.
  • برخی overloadها فرهنگ، NumberStyles، DateTimeStyles، قالب یا گزینه ignoreCase دریافت می‌کنند.
  • نوع خروجی در این مقاله long است؛ در شکست، Parse معمولاً FormatException، ArgumentException یا OverflowException ایجاد می‌کند.
  • مقدار null بسته به نوع و overload می‌تواند ArgumentNullException ایجاد کند؛ بنابراین سیاست null باید پیش از تبدیل روشن باشد.

Parse را باید به چشم یک مرز قرارداد دید. وقتی برنامه ادعا می‌کند متن حتماً معتبر است، شکست Parse وجود یک خطای داده یا برنامه‌نویسی را آشکار می‌کند. وقتی نامعتبر بودن قابل انتظار است، TryParse مدل مناسب‌تری برای کنترل جریان خواهد بود.

مثال‌های عملی مستقل

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

مثال 1: تبدیل شناسه بزرگ

در سناریوی «تبدیل شناسه بزرگ»، long.Parse() یک رشته معتبر را به مقدار نوع‌دار تبدیل می‌کند تا ادامه برنامه با داده خام درگیر نباشد.

using System;
    
    public static class Program
    {
        public static void Main()
        {
            string text = "9876543210";
            long value = long.Parse(text);
            Console.WriteLine(value);
        }
    }
ورودی یا سناریوخروجی نمونهنکته
98765432109876543210تبدیل شناسه بزرگ

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

مثال 2: پاک‌سازی اندازه فایل

برای «پاک‌سازی اندازه فایل»، فاصله یا شکل نمایش ورودی آگاهانه مدیریت می‌شود و قرارداد تبدیل روشن باقی می‌ماند.

using System;
    
    public static class Program
    {
        public static void Main()
        {
            string text = "  9876543210  ";
            long value = long.Parse(text.Trim());
            Console.WriteLine(value);
        }
    }
ورودی یا سناریوخروجی نمونهنکته
98765432109876543210پاک‌سازی اندازه فایل

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

مثال 3: پردازش شمارنده‌های طولانی

نمونه «پردازش شمارنده‌های طولانی» چند مقدار مستقل را پردازش می‌کند و کاربرد این نوع را در شناسه‌های بزرگ، اندازه فایل، شمارنده‌های طولانی، Tick و داده‌های مقیاس بالا نشان می‌دهد.

using System;
    
    public static class Program
    {
        public static void Main()
        {
            string[] values = { "9876543210", "9876543210", "9876543210" };
            int parsedCount = 0;
            foreach (string text in values)
            {
                _ = long.Parse(text);
                parsedCount++;
            }
            Console.WriteLine($"ParsedCount={parsedCount}");
        }
    }
ورودی یا سناریوخروجی نمونهنکته
9876543210ParsedCount=3پردازش شمارنده‌های طولانی

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

مثال 4: کنترل Tick مثبت

در «کنترل Tick مثبت»، خروجی نوع‌دار مستقیماً وارد شرط می‌شود؛ با این حال اعتبار دامنه از اعتبار قالب جدا نگه داشته می‌شود.

using System;
    
    public static class Program
    {
        public static void Main()
        {
            string text = "9876543210";
            long value = long.Parse(text);
            if (value > 0)
            {
                Console.WriteLine("Positive");
            }
        }
    }
ورودی یا سناریوخروجی نمونهنکته
9876543210Positiveکنترل Tick مثبت

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

مثال 5: مشاهده Int64 در Runtime

مثال «مشاهده Int64 در Runtime» ثابت می‌کند خروجی فقط یک متن تغییرشکل‌یافته نیست و Runtime نوع واقعی مقصد را ایجاد کرده است.

using System;
    
    public static class Program
    {
        public static void Main()
        {
            string text = "9876543210";
            long value = long.Parse(text);
            Console.WriteLine($"Value={value}; Type={value.GetType().Name}");
        }
    }
ورودی یا سناریوخروجی نمونهنکته
9876543210Value=9876543210; Type=Int64مشاهده Int64 در Runtime

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

مثال 6: مقدار پیش‌فرض شمارنده مفقود

در «مقدار پیش‌فرض شمارنده مفقود»، چون Parse برای null قرارداد موفقی ندارد، سیاست مقدار پیش‌فرض پیش از فراخوانی اعمال می‌شود.

using System;
    
    public static class Program
    {
        public static void Main()
        {
            string? text = null;
            long value = text is null ? default : long.Parse(text);
            Console.WriteLine(value);
        }
    }
ورودی یا سناریوخروجی نمونهنکته
98765432100مقدار پیش‌فرض شمارنده مفقود

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

مثال 7: آزمون بیشینه Int64

آزمون «آزمون بیشینه Int64» کران مهم نوع مقصد را می‌سنجد؛ محدوده این مقاله عدد صحیح علامت‌دار 64 بیتی است.

using System;
    
    public static class Program
    {
        public static void Main()
        {
            string text = "9223372036854775807";
            long value = long.Parse(text);
            Console.WriteLine(value == long.MaxValue);
        }
    }
ورودی یا سناریوخروجی نمونهنکته
9876543210Trueآزمون بیشینه Int64

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

مثال 8: ثبت تعداد بایت انتقال‌یافته

سناریوی «ثبت تعداد بایت انتقال‌یافته» به یک کاربرد پروژه‌ای در حوزه شناسه‌های بزرگ، اندازه فایل، شمارنده‌های طولانی، Tick و داده‌های مقیاس بالا نزدیک است و مقدار تبدیل‌شده را وارد منطق کسب‌وکار می‌کند.

using System;
    
    public static class Program
    {
        public static void Main()
        {
            string quantityText = "9876543210";
            long quantity = long.Parse(quantityText);
            Console.WriteLine($"Accepted={quantity > 0}; Value={quantity}");
        }
    }
ورودی یا سناریوخروجی نمونهنکته
9876543210Accepted=True; Value=9876543210ثبت تعداد بایت انتقال‌یافته

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

مثال 9: مدیریت شناسه نامعتبر

در «مدیریت شناسه نامعتبر»، FormatException یا OverflowException فقط در مرزی مدیریت می‌شود که امکان ارائه پیام اصلاحی وجود دارد.

using System;
    
    public static class Program
    {
        public static void Main()
        {
            string text = "not-a-number";
            try
            {
                _ = long.Parse(text);
            }
            catch (Exception ex) when (ex is FormatException || ex is OverflowException)
            {
                Console.WriteLine(ex.GetType().Name);
            }
        }
    }
ورودی یا سناریوخروجی نمونهنکته
9876543210FormatException یا OverflowExceptionمدیریت شناسه نامعتبر

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

مثال 10: پردازش سریع Logهای حجیم

نمونه «پردازش سریع Logهای حجیم» از TryParse استفاده می‌کند تا شکست عادی بدون ساخت استثنا گزارش شود و مسیر پرترافیک خوانا بماند.

using System;
    
    public static class Program
    {
        public static void Main()
        {
            string text = "9876543210";
            if (long.TryParse(text, out long value))
            {
                Console.WriteLine(value);
            }
        }
    }
ورودی یا سناریوخروجی نمونهنکته
98765432109876543210پردازش سریع Logهای حجیم

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

2long.ParseC# Parse

تصویر 2: long.Parse()؛ مقایسه مسیر موفق، شکست و اعتبارسنجی

خطاهای رایج و روش اصلاح

بیشتر ایرادهای تبدیل از خود API ناشی نمی‌شوند؛ منشأ آن‌ها قرارداد مبهم ورودی است. مشخص نبودن Culture، اعتماد به متن کاربر، نادیده‌گرفتن محدوده نوع و استفاده از استثنا برای کنترل جریان، رفتار سامانه را غیرقابل پیش‌بینی می‌کند.

  • فراخوانی Parse روی null یا رشته خالی؛ ابتدا سیاست مقدار اجباری، مقدار پیش‌فرض یا رد درخواست را تعیین کنید.
  • تکیه بر Culture جاری سرور؛ برای داده بین‌سامانه‌ای از CultureInfo.InvariantCulture یا قالب دقیق استفاده کنید.
  • فرض اینکه موفقیت تبدیل یعنی اعتبار کسب‌وکار؛ محدوده، موجودیت و قواعد دامنه را پس از تبدیل بسنجید.
  • گرفتن catch کلی و ادامه خاموش برنامه؛ فقط خطای قابل بازیابی را بگیرید و اطلاعات تشخیصی مناسب ثبت کنید.
  • تبدیل چندباره همان متن در لایه‌های مختلف؛ یک بار در مرز تبدیل کنید و مقدار نوع‌دار را به داخل بفرستید.
  • قرار دادن Parse در حلقه‌ای با نرخ خطای بالا؛ در این مسیر از TryParse و پردازش نتیجه bool استفاده کنید.

کارایی، حافظه و رفتار سیستمی

برای ورودی معتبر، long.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 تأیید کنید.

کاربرد واقعی در معماری نرم‌افزار

در سامانه سازمانی، long.Parse() بهتر است در لایه ورودی، Mapper یا Value Object قرار گیرد. رشته خام مربوط به شناسه‌های بزرگ، اندازه فایل، شمارنده‌های طولانی، Tick و داده‌های مقیاس بالا پس از اعتبارسنجی به مقدار نوع‌دار تبدیل می‌شود و لایه دامنه دیگر درگیر جزئیات نمایش متن نیست.

این الگو تست‌پذیری را افزایش می‌دهد، پیام‌های خطا را یکپارچه می‌کند و مانع پخش‌شدن منطق تبدیل در Controller، فرم و Repository می‌شود. برای پروژه‌های بزرگ می‌توان نتیجه تبدیل را در یک Result type قرار داد تا خطا بدون Exception به لایه نمایش برگردد.

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

۱. long.Parse() دقیقاً چه کاری انجام می‌دهد؟

long.Parse() نمایش متنی معتبر را مطابق قواعد نوع مقصد به یک مقدار نوع‌دار تبدیل می‌کند. نتیجه پس از تبدیل می‌تواند در محاسبه، شرط، ذخیره‌سازی یا منطق دامنه استفاده شود و دیگر لازم نیست با رشته خام کار کنیم.

۲. چه زمانی استفاده از long.Parse() برای تازه‌کاران مناسب است؟

وقتی منبع داده مورد اعتماد است، قالب از قبل اعتبارسنجی شده و شکست واقعاً یک وضعیت استثنایی محسوب می‌شود، Parse انتخابی ساده و خواناست. برای ورودی مستقیم کاربر معمولاً TryParse تجربه مقاوم‌تری ایجاد می‌کند.

۳. آیا استفاده درست از long.Parse() هزینه نگهداری پروژه را کم می‌کند؟

بله؛ تبدیل در مرز سیستم و انتقال مقدار نوع‌دار به لایه‌های داخلی، شرط‌های تکراری و خطاهای پنهان را کاهش می‌دهد. این جداسازی در پروژه‌های تجاری، گزارش‌گیری و سامانه‌های چندلایه ارزش زیادی دارد.

۴. در پروژه سفارشی چگونه سیاست تبدیل long.Parse() طراحی می‌شود؟

قالب ورودی، فرهنگ، رفتار null، محدوده مجاز، پیام خطا و محل ثبت رخداد باید در قرارداد ورودی مشخص شوند. سپس تبدیل در یک نقطه مشترک مانند Validator، Mapper یا لایه ورودی پیاده‌سازی و با تست پوشش داده می‌شود.

۵. تفاوت کلیدی Parse و TryParse برای long.Parse() چیست؟

Parse در شکست استثنا پرتاب می‌کند، ولی TryParse با یک مقدار bool موفقیت را گزارش می‌دهد و خروجی را از پارامتر out تحویل می‌دهد. تفاوت اصلی در قرارداد شکست است، نه صرفاً شکل نوشتن کد.

۶. برای پیاده‌سازی حرفه‌ای long.Parse() چه خدماتی لازم می‌شود؟

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

۷. خطاهای رایج long.Parse() کدام‌اند؟

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

۸. آیا long.Parse() از نظر Performance کند است؟

روی ورودی معتبر معمولاً تبدیل سریع است؛ مشکل اصلی زمانی رخ می‌دهد که داده نامعتبر زیاد باشد و Parse مرتب استثنا بسازد. اندازه‌گیری با داده واقعی، Release build، Runtime هدف و ابزار مناسب از حدس بهتر است.

۹. بهترین روش استفاده از long.Parse() چیست؟

فرهنگ و قالب را صریح کنید، تبدیل را در مرز ورودی نگه دارید، دامنه مجاز را جداگانه بسنجید، از تبدیل تکراری جلوگیری کنید و برای تمام کران‌ها تست داشته باشید. شکست قابل انتظار را نیز با TryParse مدل کنید.

۱۰. long.Parse() با کدام نسخه‌های C# و .NET سازگار است؟

شکل‌های پایه Parse سال‌هاست در .NET وجود دارند، اما overloadهای Generic، Span و رابط‌های جدید مانند IParsable به نسخه Runtime وابسته‌اند. پیش از استفاده از overload جدید، Target Framework پروژه و مستندات همان نسخه را کنترل کنید.

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

سؤالمحور پاسخ حرفه‌ای
چه زمانی long.Parse() را به TryParse ترجیح می‌دهید؟قرارداد قطعی ورودی و استثنایی‌بودن واقعی شکست
چرا CultureInfo روی تبدیل مهم است؟جداکننده، قالب، زبان و پایداری داده بین‌سامانه‌ای
موفقیت Parse چه چیزی را تضمین نمی‌کند؟اعتبار دامنه، مجوز، موجودیت و منطق کسب‌وکار
استثنا در حلقه داغ چه اثری دارد؟هزینه CPU، تخصیص و پیچیدگی مسیر کنترل
Span چه زمانی مفید است؟حذف برش رشته و کاهش تخصیص در پردازش حجیم

چک‌لیست نهایی

  • نوع مقصد و محدوده آن با دامنه هماهنگ است.
  • قالب و Culture ورودی مستند شده است.
  • رفتار null و رشته خالی مشخص است.
  • Parse یا TryParse بر اساس قرارداد شکست انتخاب شده است.
  • اعتبار نحوی و اعتبار کسب‌وکار جدا هستند.
  • مقادیر مرزی و نامعتبر تست شده‌اند.
  • در مسیر پرترافیک اندازه‌گیری واقعی انجام شده است.
  • پیام خطا مفید است و اطلاعات حساس را افشا نمی‌کند.
3long.ParseC# Parse

تصویر 3: long.Parse()؛ چک‌لیست انتخاب API و آماده‌سازی برای تولید

جمع‌بندی

long.Parse() زمانی بهترین انتخاب است که متن مطابق قراردادی قطعی و معتبر وارد شود و شکست باید یک وضعیت استثنایی باشد. برای ورودی نامطمئن، TryParse کنترل صریح‌تر و معمولاً رفتار کاراتری در مسیر شکست ارائه می‌کند. انتخاب نوع، فرهنگ، تست مرزی و محل تبدیل به اندازه خود فراخوانی متد اهمیت دارند.

برای مقایسه این API با سایر تبدیل‌ها، راهنمای جامع متدهای Parse در C# و .NET را ببینید. این راهنما نقشه کامل bool، انواع عددی، DateTime، Guid، Enum و تحلیل کارایی را یکجا ارائه می‌کند.

 

0 نظر

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

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

حرف 500 حداکثر