الكشف الثابت (مرجعC#)
تمنع عبارة الـ fixed حاوي المهملات من تغيير موقع المتغير المتحرك. الكشف fixed مسموح فقط في سياق غير آمن. Fixed يمكن أيضاً استخدامه لإنشاء المخازن مؤقتة ثابتة الحجم.
الكشفfixed تعيين مؤشر إلى متغير مدارة و "أطراف" هذا المتغير أثناء تنفيذ الكشف. بدون fixed، وستكون المؤشرات إلى المتغيرات منقولة تتم إدارتها ستكون قليلة الاستخدام طالما حاوي المهملات يمكنه نقل المتغيرات كما كان غير متوقعا. فقط المترجم C# يتيح لك تعيين مؤشر إلى متغير مدار في الكشف fixed .
unsafe static void TestMethod()
{
// assume class Point { public int x, y; }
// pt is a managed variable, subject to garbage collection.
Point pt = new Point();
// Using fixed allows the address of pt members to be
// taken, and "pins" pt so it isn't relocated.
fixed (int* p = &pt.x)
{
*p = 1;
}
}
يمكنك تهييّئ مؤشر بعنوان من صفيف أو سلسلة:
unsafe void Test2()
{
Point point = new Point();
double[] arr = { 0, 1.5, 2.3, 3.4, 4.0, 5.9 };
string str = "Hello World";
fixed (double* p = arr) { /*...*/ } // equivalent to p = &arr[0]
fixed (char* p = str) { /*...*/ } // equivalent to p = &str[0]
fixed (int* p1 = &point.x)
{
fixed (double* p2 = &arr[5])
{
// Do something with p1 and p2.
}
}
}
يمكنك تهييئ مؤشرات متعددة طالما كانت كلها من نفس النوع:
fixed (byte* ps = srcarray, pd = dstarray) {...}
لتهيئة مؤشرات من نوع مختلف, ببساطة الكشوف المتداخلة fixed :
fixed (int* p1 = &point.x)
{
fixed (double* p2 = &arr[5])
{
// Do something with p1 and p2.
}
}
بعد تعليمات برمجية في تنفيذ العبارة ، أية متغيرات المضافة يتم تجميع البيانات المهملة unpinned و خاضع. بعد تنفيذ التعليمات البرمجية في الكشف، أية متغيرات مضافة و غير مضافة تخضع لحاوي المهملات. ولذلك، لا تشر لهذه المتغيرات خارج الكشف fixed.
ملاحظة
لا يمكن تعديل المؤشرات المهيئة في الكشوف الثابتة.
في الوضع الغير آمن يمكنك تخصيص ذاكرة تشغيل في مكدس حيث يكون ليس عرضة لحاوي البيانات المهملة ولذلك لا تحتاج إلى أن يتم إضافته. لمزيد من المعلومات، راجع إرسال إحدى رسائل الفاكس.
مثال
class Point
{
public int x, y;
}
class FixedTest2
{
// Unsafe method: takes a pointer to an int.
unsafe static void SquarePtrParam (int* p)
{
*p *= *p;
}
unsafe static void Main()
{
Point pt = new Point();
pt.x = 5;
pt.y = 6;
// Pin pt in place:
fixed (int* p = &pt.x)
{
SquarePtrParam (p);
}
// pt now unpinned
Console.WriteLine ("{0} {1}", pt.x, pt.y);
}
}
/*
Output:
25 6
*/
مواصفات لغة #C
لمزيد من المعلومات، راجع مواصفات لغة #C. مواصفات اللغة هي المصدر النهائي لبناء جملة C# واستخدامها.
راجع أيضًا:
المرجع
ثابت حجم المخازن المؤقتة (البرمجة C# إرشادات)