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

span چیه؟
Span یک ساختار Ref است که شما را قادر می سازد تا بدون اختصاص حافظه اضافی ، منطقه ای از حافظه (آرایه ها ، رشته ها ، حافظه بومی) را به طور کارآمد و ایمن دستکاری کنید.
❓ چرا به دهانه احتیاج داریم؟
- از تخصیص حافظه غیر ضروری خودداری کنید.
- بدون کپی کردن با بخشی از آرایه یا رشته کار کنید.
- بافرها یا بخشهای حافظه را به طور کارآمد دستکاری کنید.
- دسترسی به حافظه پشته از طریق StackAlloc برای سود عملکرد.
اعلام و استفاده از دهانه
- از یک آرایه یا رشته موجود
// 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"
- روی پشته با 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
➡ اینجا:
- نمونه دهانه در پشته زندگی می کند
- اما بایت واقعی[100] آرایه روی پشته اختصاص می یابد
- این تخصیص توسط جمع کننده زباله (GC) اداره می شود
✅ با stackalloc:Span
➡ اکنون:
- هر دو دهانه و 100 بایت داده روی پشته قرار دارند
- 🧠 تخصیص پشته و بنابراین فشار GC وجود ندارد
رمز | کجاست Span ؟ |
داده ها کجاست؟ | GC درگیر؟ |
---|---|---|---|
Span |
📦 پشته | 🧠 پشته | ✅ بله |
Span |
📦 پشته | 📦 پشته | ❌ نه |
⛔ محدودیت های دهانه
💥 چرا نمی تواند یک رشته در یک کلاس باشد؟
- نمونه های کلاس در پشته زندگی می کنند.
- دهانه یک ساختار ref است ، به این معنی که باید روی پشته زندگی کند و مجاز به ذخیره در پشته نیست.
- اگر یک دهانه در یک قسمت کلاس ذخیره شود ، می تواند به حافظه پشته مراجعه کند که پس از خروج روش دیگر معتبر نیست.
- این امر منجر به رفتار نامشخص ، فساد احتمالی حافظه و خطرات امنیتی می شود.
– چرا که در بازده بازده ، روشهای async یا لامبدا مجاز نیست؟
- بازده بازده ، عبارات Async و Lambda نیز در دستگاه های دولتی که در پشته زندگی می کنند ، گردآوری می شوند.
- متغیرهای داخل زمینه Async/Lambda اغلب به عنوان بخشی از دستگاه بسته شدن یا حالت در پشته ذخیره و ذخیره می شوند.
- اگر دهانه ای از این طریق ضبط می شد ، می تواند مرجع حافظه پشته را به یک شیء پشته نشت کند.
❌ این امر ایمنی حافظه و تضمین های طول عمر را نقض می کند ، بنابراین کامپایلر این استفاده را مسدود می کند.