برنامه نویسی

دهانه جامعه C# – Dev Community

طول

span چیه؟

Span یک ساختار Ref است که شما را قادر می سازد تا بدون اختصاص حافظه اضافی ، منطقه ای از حافظه (آرایه ها ، رشته ها ، حافظه بومی) را به طور کارآمد و ایمن دستکاری کنید.

❓ چرا به دهانه احتیاج داریم؟

  1. از تخصیص حافظه غیر ضروری خودداری کنید.
  2. بدون کپی کردن با بخشی از آرایه یا رشته کار کنید.
  3. بافرها یا بخشهای حافظه را به طور کارآمد دستکاری کنید.
  4. دسترسی به حافظه پشته از طریق StackAlloc برای سود عملکرد.

اعلام و استفاده از دهانه

  1. از یک آرایه یا رشته موجود
// Given an array
int[] numbers = { 10, 20, 30, 40, 50 };

// Create a Span over the whole array
Span allNums = numbers.AsSpan();

// Create a slice over elements 1–3 (20,30,40)
Span middleNums = allNums.Slice(1, 3);

// You can read and write through the span:
middleNums[0] = 25;       // numbers[1] is now 25
Console.WriteLine(numbers[2]);  // prints 30

// For strings use ReadOnlySpan
string text = "Hello, world!";
ReadOnlySpan hello = text.AsSpan(0, 5);
Console.WriteLine(hello.ToString());  // "Hello"

حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

  1. روی پشته با stackalloc
// Allocate 8 ints on the stack (no heap allocation)
Span stackBuf = stackalloc int[8];

// Initialize and use
for (int i = 0; i < stackBuf.Length; i++)
{
    stackBuf[i] = i * i;
}
Console.WriteLine(stackBuf[3]);  // prints 9

حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

❓ چرا ما به stackalloc احتیاج داریم؟
از آنجا که Span یک ساختار ref است و روی پشته زندگی می کند ، چرا برای اختصاص یک بافر روی پشته به StackAlloc نیاز داریم؟
✅ بله ، دهانه خود در پشته زندگی می کند (زیرا این یک ساختار Ref است)
❌ اما داده هایی که به آن اشاره می کند به طور خودکار روی پشته نیست

🔍 به طور پیش فرض:
Span s = new byte[100];

➡ اینجا:

  • نمونه دهانه در پشته زندگی می کند
  • اما بایت واقعی[100] آرایه روی پشته اختصاص می یابد
  • این تخصیص توسط جمع کننده زباله (GC) اداره می شود

✅ با stackalloc:
Span s = stackalloc byte[100];

➡ اکنون:

  • هر دو دهانه و 100 بایت داده روی پشته قرار دارند
  • 🧠 تخصیص پشته و بنابراین فشار GC وجود ندارد
رمز کجاست Span؟ داده ها کجاست؟ GC درگیر؟
Span s = new byte[100]; 📦 پشته 🧠 پشته ✅ بله
Span s = stackalloc byte[100]; 📦 پشته 📦 پشته ❌ نه

⛔ محدودیت های دهانه

💥 چرا نمی تواند یک رشته در یک کلاس باشد؟

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

– چرا که در بازده بازده ، روشهای async یا لامبدا مجاز نیست؟

  • بازده بازده ، عبارات Async و Lambda نیز در دستگاه های دولتی که در پشته زندگی می کنند ، گردآوری می شوند.
  • متغیرهای داخل زمینه Async/Lambda اغلب به عنوان بخشی از دستگاه بسته شدن یا حالت در پشته ذخیره و ذخیره می شوند.
  • اگر دهانه ای از این طریق ضبط می شد ، می تواند مرجع حافظه پشته را به یک شیء پشته نشت کند.

❌ این امر ایمنی حافظه و تضمین های طول عمر را نقض می کند ، بنابراین کامپایلر این استفاده را مسدود می کند.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا