بهبود مقایسه برابری کاراکترها در NET 11.
نویسنده: وحید نصیری
تاریخ: ۱۴۰۵/۰۴/۲۳ ۰۸:۳۵
آدرس: www.dntips.ir
'i' و 'I' با یکدیگر برابر هستند؟ پاسخ به این سوال در دنیای مهندسی نرمافزار همواره یک جمله معروف است: «بستگی دارد!»'i' به صورت 'İ' نوشته میشود و مقایسه آن قوانین کاملاً متفاوتی دارد). در نسخههای پیشین داتنت، اعمال این ظرافتها بر روی نوع دادهی کاراکتر (char) با محدودیتهایی همراه بود که توسعهدهندگان را مجبور به استفاده از ترفندهای جانبی میکرد. در این مقاله به بررسی این چالش و راهکار کارآمد معرفیشده در نسخه پیشنمایش .NET 11 میپردازیم.Equals در ساختار Char تنها یک اورلود (Overload) داشت که یک کاراکتر دیگر را به عنوان ورودی دریافت میکرد:Console.WriteLine('i'.Equals('I')); // Output: FalseFalse بود.StringComparison استفاده کنند:Console.WriteLine(string.Equals('i'.ToString(), 'I'.ToString(), StringComparison.CurrentCultureIgnoreCase));ToString() روی کاراکترها باعث تخصیص حافظه جدید روی Heap برای رشتهها میشود. در برنامههایی با پردازش سنگین متون (مانند پارسرها)، این عمل بار اضافی به زبالهروب (Garbage Collector) تحمیل میکند.Equals در ساختار Char، این گپ قدیمی را برطرف کرده است. اکنون شما میتوانید به طور مستقیم نوع مقایسه مورد نظر خود را با ارسال هنجار StringComparison به متد مقایسه کاراکتر مشخص کنید:// نمونههای مختلف مقایسه مستقیم در داتنت ۱۱
Console.WriteLine('i'.Equals('I', StringComparison.CurrentCultureIgnoreCase));
Console.WriteLine('i'.Equals('I', StringComparison.CurrentCulture));
Console.WriteLine('i'.Equals('I', StringComparison.InvariantCulture));
Console.WriteLine('i'.Equals('I', StringComparison.InvariantCultureIgnoreCase));
Console.WriteLine('i'.Equals('I', StringComparison.Ordinal));
Console.WriteLine('i'.Equals('I', StringComparison.OrdinalIgnoreCase));StringComparison نقش کلیدی در امنیت، صحت رفتار برنامه و کارایی آن دارد:ToString() است. متد جدید مستقیماً روی دادههای از نوع مقدار (Value Type) در Stack کار میکند. این امر به ویژه در سناریوهایی نظیر نوشتن پارسرهای متنی متداول (مانند JSON Parsers یا Compiler Lexers) که میلیونها کاراکتر را در ثانیه بررسی میکنند، بهبود عملکرد و سرعت پردازش چشمگیری را به همراه دارد.Char.Equals در .NET 11 گام به ظاهر کوچکی است، اما کدهای ما را تمیزتر، خواناتر و بسیار سریعتر از قبل میکند. به عنوان یک توسعهدهنده داتنت، پیشنهاد میشود در پروژههای آینده خود با مهاجرت به این نسخه، از نوشتن کدهای تایید هویت کاراکتری قدیمی و سنگین خودداری کنید.