توسعهی بومی ویژگیهای زبان: افزودن اعضای استاتیک سفارشی به کلاسهای موجود در C# 14
نویسنده: وحید نصیری
تاریخ: ۱۴۰۵/۰۴/۲۹ ۰۸:۲۰
آدرس: www.dntips.ir
"file1.txt" -> "file10.txt" -> "file2.txt""file1.txt" -> "file2.txt" -> "file10.txt"StringComparer در فریمورک داتنت اعضای استاتیکی نظیر StringComparer.Ordinal یا StringComparer.OrdinalIgnoreCase را برای سناریوهای رایج ارائه میدهد. اگر بخواهیم الگوریتم NaturalSortComparer اختصاصی خود را بسازیم، پیادهسازی پایه آن در C# به شکل زیر خواهد بود:public class NaturalSortComparer : StringComparer
{
public override int Compare(string? x, string? y)
{
// پیادهسازی منطق مقایسه طبیعی (Natural Sort)
return LogicalStringComparer.Compare(x, y);
}
public override bool Equals(string? x, string? y) => string.Equals(x, y);
public override int GetHashCode(string obj) => obj?.GetHashCode() ?? 0;
}NaturalSort بخشی از خود خانواده StringComparer است.StringComparer تعریف میشد:public static class StringComparerExtensions
{
public static StringComparer NaturalSort(this StringComparer comparer)
=> new NaturalSortComparer();
}StringComparer.Ordinal.NaturalSort() خواهد بود. ساخت نمونه از یک مقایسهگر قبلی جهت فراخوانی مقایسهگر جدید غیرضروری و عجیب به نظر میرسد.public static class NaturalSort
{
public static StringComparer Instance { get; } = new NaturalSortComparer();
}
// نحوه استفاده:
var files = Directory.GetFiles(path)
.OrderBy(f => f, NaturalSort.Instance);.StringComparer با پیشنهادهای هوشمند کد (IntelliSense) برای این الگوریتم مواجه نمیشود و باید از وجود کلاس جداگانه NaturalSort آگاه باشد.NaturalSort را مستقیماً به خانواده StringComparer تزریق کنیم:public static class StringComparerExtensions
{
extension(StringComparer)
{
public static StringComparer NaturalSort => new NaturalSortComparer();
}
}// استفاده کاملاً بومی و حرفهای
var files = Directory.GetFiles(path)
.OrderBy(f => f, StringComparer.NaturalSort);نکته تکمیلی و بهینهسازی کارایی (Zero-Allocation Pattern):
در کد اولیه، هر بار فراخوانیStringComparer.NaturalSortیک نمونه جدید ازNaturalSortComparerمیسازد. برای جلوگیری از تخصیص حافظه مداوم و فشار بر روی Garbage Collector، بهتر است نمونه استاتیک را یکبار ساخته و Re-use کنیم:
public static class StringComparerExtensions
{
private static readonly StringComparer _cachedNaturalSort = new NaturalSortComparer();
extension(StringComparer)
{
// بازگرداندن نمونه کششده جهت ارتقای نرخ تخصیص حافظه
public static StringComparer NaturalSort => _cachedNaturalSort;
}
}| معیار ارزیابی | متد توسعه سنتّی | کلاس مجزا / Singleton | C# 14 Extension Block |
| کشفپذیری (IntelliSense) | ضعیف | بسیار ضعیف | عالی (طبیعی) |
| تمیزی و روان بودن نحو | متوسط | خوب | فوقالعاده (Fluent) |
| مدیریت حافظه (Allocation) | ایجاد شیء اضافه | یکبار تخصیص | قابل بهینهسازی کامل |