[英]fixed keyword to lock a reference type variable in memory from an unsafe context?
下面是處理指針類型時不使用fixed的代碼:
class PointRef
{
public int x;
}
public unsafe static void UseAndPinPoint()
{
PointRef pt = new PointRef { x = 5 };
int* p = &pt.x;
... Use int* variable here!
Console.WriteLine("Point is: {0}", pt);
}
我的教科書說它必須使用固定關鍵字,否則有可能是不安全的上下文試圖與一個不再可訪問的成員交互,或者在經過一代掃描后在堆上重新定位。
在這個例子中,我不太明白。 是不是pt總是指向引用的對象(如果我們不重新分配pt指向不同的PointRef對象,因為pt = new PointRef { x = 1 };
),所以在UseAndPinPoint之前對象不會被垃圾收集( )方法完成。
pt.x
是一個固定變量 ,你只需要對可移動變量使用fixed
語句,這在文檔中都很清楚
固定變量駐留在不受垃圾收集器操作影響的存儲位置。 (固定變量的示例包括局部變量,值參數和通過解除引用指針創建的變量。)另一方面,可移動變量駐留在由垃圾收集器進行重定位或處理的存儲位置。 (可移動變量的示例包括對象中的字段和數組的元素。)
&
運算符(運算符地址)允許無限制地獲得固定變量的地址 。 但是,由於可移動變量需要由垃圾收集器進行重定位或處理, 因此只能使用固定語句 (固定語句) 獲取可移動變量的地址 ,並且該地址僅在該固定語句的持續時間內有效。准確地說,固定變量是以下之一:
- 由simple_name(簡單名稱)引用的變量,引用局部變量或值參數,除非該變量由匿名函數捕獲。
- 由表單VI的member_access(成員訪問)產生的變量,其中V是struct_type的固定變量 。
- 由形式為P的pointer_indirection_expression(指針間接),P-> I形式的pointer_member_access(指針成員訪問)或形式P [E]的pointer_element_access(指針元素訪問)產生的變量。
所有其他變量都歸類為可移動變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.