2015-02-06 2 views
13

C# 언어 사양을 통해 검색 중이므로 포인터 유형 (예 : int*)이 기본값으로 초기화되는지 여부를 확인할 수있는 항목을 찾을 수 없습니다. 간단한 테스트 응용 프로그램을 만들었고 0으로 초기화하는 것처럼 보였습니다.하지만이를 사양과 함께 확인하고 싶습니다. 나는 IntPtr 클래스를 정의하려면이 코드를 사용 반사판에 눈치 때문에C# 포인터 유형의 기본값

나는이 찾기 시작의 IntPtr.Zero : 당신이 IntPtr.Zero 비교할 때 실제로 할당 된 기본 값과 비교하는 것을 의미

public struct IntPtr : ISerializable 
{ 
    private unsafe void* m_value; 
    public static readonly IntPtr Zero; 

    ....... 

    public static unsafe bool operator ==(IntPtr value1, IntPtr value2) 
    { 
     return (value1.m_value == value2.m_value); 
    } 

    ........ 
} 

필드에는 void* 유형이 있습니다.

감사합니다.

+1

명확한 할당 분석과 상호 작용하는 방법을 설명하는 포인터를 논의하는 사양의 일부가 있습니다. 명확한 할당 분석의 전체적인 점은 변수의 초기화되지 않은 상태를 관찰하는 것을 피하기위한 것이고 아마도 그 대답은 Mu입니다. 또한 프레임 워크 유형의 구현에서 볼 수있는 모든 것이 전체적인 이야기는 아닙니다. 런타임에 의한 특수 처리로 인해 실제 동작이 생성되는 경우가 있습니다. –

+0

잘 보였다 ... 그들이 스펙을 쓰는 동안 그것을 놓친 것처럼 보인다. 032 (null)이라고 가정 할 수 있습니다 :-) – buffjape

+0

CIL은 포인터 유형을 참조 유형의 하위 집합으로 정의하지만 C#은 포인터 유형을 다른 유형의 클래스로 정의한다는 점에서 혼란을줍니다. 따라서 CIL이 참조 유형의 기본값이 'null'이라는 것을 지정하면 C#이 동일한 것을 지정하는 것보다 더 많은 것을 의미합니다. – hvd

답변

-1

Visual Studio 디버거를 사용하면 int 포인터에 할당 된 기본값을 가져올 수 있습니다. 32 비트 아키텍처에서는 0x00000000 (32 0 비트)입니다.

class Program 
{ 
    private static unsafe int* m_value; 
    static void Main(string[] args) 
    { 
    } // <<== Break point here 
} 

Watch Window 
_____________________________________________ 
Name Value  Type 
======= ========== ======== 
m_value 0x00000000 int* 
+2

예, 제가 말했듯이이 작업을 수행하는 테스트 앱을 작성했지만 이것이 반드시 값이 항상 0이 될 것이라는 의미는 아닙니다 (운이 좋을 수도 있음). – user3784392

+3

C# 사양은 포인터의 기본 값을 매우 신중하게 정의하지 않습니다. – Rawling

1

저는 포인터에 기본값이 없다고 생각합니다. 포인터의 값은 할당 된 것을 포함하는 메모리 부분의 주소이기 때문에. 당신이 그것을 할당하지 않은 경우, 그것은 메모리에있는 모든 것을 가리킬 수 있습니다.

아마도 CLR의 기본 동작은 Carmelo Floridia의 대답 에서처럼 보이는 0 또는 0으로 초기화 된 포인터 또는 핸들을 나타내는 IntPtr.Zero으로 설정하는 것일 수 있습니다. 이것은 사양이 정교하지 않은 구현 세부 사항 인 것 같습니다.

1

사양 별 포인터 유형의 기본값은 null입니다. 이것은 두 가지 사실에서 따릅니다.

첫 번째 사실은 포인터가 참조 유형입니다. ECMA-335에 설명되어 있습니다. enter image description here

두 번째 사실은 reference-type has default value - null입니다.

+0

포인터의'Type.IsClass'는'true'이지만'default (typeof (void *))'는'IntPtr.Zero'이며 null이 아닙니다. 참조 형은 기본값이'null' * always * 또는 포인터가 참조 형이 아닙니다. 나는 그것이 이전의 것이라고 믿는다. – nawfal

+0

@nawfal'IntPtr.Zero'는 기본적으로 초기화됩니다. 첫 번째 필드'IntPtr.Zero'는'private unsafe void * m_value'입니다. 'void * m_value'가'IntPtr.Zero'이면 우리는 재귀의 유사성을가집니다. –

관련 문제