2012-02-15 56 views
2

何時使用fixed()語句進行固定?我看到很多例子,包括這個來自Microsoft何時需要鎖定以避免C#垃圾回收器移動對象?

public class Win32API { 
[DllImport("User32.Dll")] 
public static extern void GetWindowText(int h, StringBuilder s, 
int nMaxCount); 
} 
public class Window { 
    internal int h;  // Internal handle to Window. 
    public String GetText() { 
     StringBuilder sb = new StringBuilder(256); 
     Win32API.GetWindowText(h, sb, sb.Capacity + 1); 
    return sb.ToString(); 
    } 
} 

什麼阻止垃圾收集器從GetWindowText函數中移動StringBuilder對象()調用,他們爲什麼不釘扎某人與固定()語句?

+1

其中之一是因爲固定語句實際上並未固定對象。 pinvoke編組的職責是真正固定,但僅在必要時。不在這裏,charset是錯誤的。 – 2012-02-15 03:09:56

回答

7

使用平臺調用時的編組系統將防止對象被移動,但只在方法調用的持續時間內移動。

如果本地端要保存對該對象的引用並嘗試稍後執行「某事」,則需要進行固定。使用P/Invoke進行本地方法的單個調用不是必需的。