تبدیلات ضمنی Span در C# 14
نویسنده: وحید نصیری
تاریخ: ۱۴۰۴/۰۷/۳۰ ۰۹:۴۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
Span از زمان معرفی در C# 7.2، ابزاری قدرتمند برای مدیریت حافظه بدون تخصیص غیرضروری بودهاست. اما استفاده از آن گاهی با پیچیدگیهای نحوی همراه بود؛ بهویژه هنگام فراخوانی متدها که Span یا ReadOnlySpan میپذیرفتند.Span معرفی کردهاست که تجربه توسعه را روانتر، کد را تمیزتر و عملکرد را بهتر میکند. در این مقاله به بررسی این تغییر، مشکلات قبلی و راهحل جدید میپردازیم.string str = "test string"; string substring = str.Substring(0, 4); // "test"
AsSpan()Span استفاده میکنیم:ReadOnlySpan<char> span = str.AsSpan().Slice(0, 4);
ReadOnlySpan بپذیرد، نمیتوانید مستقیماً string یا آرایه را پاس دهید:public static void ProcessSpan<T>(ReadOnlySpan<T> span) { }
var arr = new int[10];
string text = "hello";
ProcessSpan(arr); // خطا: نیاز به AsSpan()
ProcessSpan(text); // خطا: نیاز به AsSpan().AsSpan():ProcessSpan(arr.AsSpan()); ProcessSpan(text.AsSpan());
ProcessSpan(arr); // OK: تبدیل ضمنی به Span<int> ProcessSpan(charSpan); // OK ProcessSpan(readOnlyCharSpan); // OK ProcessSpan<char>(text); // OK: فقط برای string نیاز به <char>
T[]) و Span/ReadOnlySpan موجود، تبدیل کاملاً ضمنی است.string)، به دلیل ابهام نوع (char یا byte؟)، باید نوع جنریک را صراحتاً مشخص کنید: .public static void LogFirstFourChars(ReadOnlySpan<char> span)
{
if (span.Length >= 4)
Console.WriteLine($"اولین ۴ کاراکتر: {span.Slice(0, 4).ToString()}");
}
// استفاده جدید — تمیز و سریع
string message = "سلام دنیا!";
int[] numbers = { 1, 2, 3, 4, 5 };
LogFirstFourChars<char>(message); // خروجی: "سلام"
LogFirstFourChars(numbers); // کامپایل میشود (Span<int>)Span در C# 14 یک بهبود کوچک اما تأثیرگذار است که:نکته طلایی: هر جاSpanیاReadOnlySpanدر امضای متد دیدید، حالا میتوانید با اطمینان و بدون.AsSpan()از آرایهها و رشتهها استفاده کنید — فقط یادتان باشد برایstring، نوع جنریک<char>را اضافه کنید.