2010-02-02 3 views
2

C# unsafe 블록의 void*에 CLR 유형에 대한 포인터를 할당하는 방법이 있습니까?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

어리석은 질문 일 수는 있지만 왜 무효 포인터가 필요합니까? –

+0

은 void 포인터 일 필요는 없지만 int와 같은 프리미티브 또는 System.Text.StringBuilder와 같은 복잡한 유형이 될 수있는 값에 대한 포인터가 필요하다. int (일명 "Object"처럼 느리게 처리 할 수는 없습니다) – thr

+0

무엇을하려고 하느냐에 따라 generics 사용을 고려해야합니다. 제네릭은 값 유형을 boxing하지 않고 다양한 유형을 처리하는 C# 방식입니다. –

답변

3

:

다음 유형의가 포인터 타입 일 수있다 :

  • sbyte 바이트, 짧은 USHORT, INT, UINT 길고 ULONG, char, float,
    double, decimal 또는 bool.
  • 모든 열거 형입니다.
  • 모든 포인터 유형.
  • 관리되지 않는 유형의 필드가 포함 된 사용자 정의 struct 유형 . 당신의 fixed 컨텍스트에서 클래스 멤버에 대한 포인터를 가질 수 있지만, 다음과 같이

은 (System.Text.StringBuilder의 인스턴스에 대한 예를 들어, 포인터) 클래스의 인스턴스에 대한 포인터를 가질 수있는 방법은 없습니다 코드 :

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가 객체를 움직이지 않는 것을 알 수 있습니다. 는 MSDN documentation 따르면

+0

어떻게 관리 객체를 찾습니까? int 또는 byte를 다루는 예제 만 찾을 수 있습니다. – thr

+0

내가 얻는 것은 컴파일 타임에 "이 주소를 가져갈 수 없거나, 크기를 얻거나, 포인터를 관리되는 형으로 선언 할 수 없다"입니다. – thr

관련 문제