2010-02-02 75 views
2

有沒有辦法在一個C#unsafe塊分配一個指向CLR類型的void*將指針指向CLR類型以使用不安全的void *

var bar = 1; 
var foo = new Foo(); 

unsafe 
{ 
    void* p1 = &bar; 
    void* p2 = &foo; // fails at compile time 
} 

或者這隻能使用C++/CLI:

System::Text::StringBuilder^ sb = gcnew System::Text::StringBuilder(); 
void* p1 = &sb; 

找不到任何方式,使其在正常工作C#

+0

可能是一個愚蠢的問題,但爲什麼你需要一個無效的指針呢? – 2010-02-02 13:52:47

+0

不一定是一個void指針,但我需要一個指向一個值的指針,該值可以是像int這樣的基本類型,也可以是像System.Text.StringBuilder這樣的複雜類型,而不必在它們之間有所區別, int(也就是說,不能像「Object」那樣把它放慢) – thr 2010-02-02 13:55:42

+0

根據你要做的事情,你應該考慮使用泛型。泛型是C#處理各種類型的方式,而不用裝箱值類型。 – 2010-02-02 20:56:52

回答

3

按照MSDN documentation

以下任何類型的可以是 指針類型:

  • 爲sbyte,字節,短,USHORT,INT,UINT,長,ulong,則char,float,
    double,decimal或bool。
  • 任何枚舉類型。
  • 任何指針類型。
  • 任何用戶定義的結構類型,僅包含非託管類型字段 。

有沒有辦法有一個指針指向一個類的實例(如指針的System.Text.StringBuilder一個實例),雖然你可以有一個指針,指向fixed上下文中的類成員,如下面的代碼:

class Test 
{ 
static int x; 
int y; 
unsafe static void F(int* p) { 
    *p = 1; 
} 
static void Main() { 
    Test t = new Test(); 
    int[] a = new int[10]; 
    unsafe { 
     fixed (int* p = &x) F(p); 
     fixed (int* p = &t.y) F(p); // pointer to a member of a class 
     fixed (int* p = &a[0]) F(p); 
     fixed (int* p = a) F(p); 
    } 
} 
} 
2

爲了得到一個指向一個管理對象,它必須爲fixed,以便GC知道不要移動物體。

+0

如何查找託管對象?我只能找到處理int或byte的例子。 – thr 2010-02-02 13:39:17

+0

我得到的所有錯誤是「編譯時不能獲取地址,獲取大小或者指定託管類型的指針」 – thr 2010-02-02 13:39:59

相關問題