2013-11-14 6 views
2

간단한 관찰 만 있습니다. property MethodBase.IsConstructorstatic 생성자에서는 작동하지 않으며 설명서에는이 사실이 언급되어 있지 않습니다.이 메서드가 ConstructorInfo 개체로 표시되는 생성자 인 경우 "true"입니다.MethodBase.IsConstructor가 정적 생성자로 지정된대로 작동하지 않습니다.

샘플 :

static class Program 
{ 
    static void Main() 
    { 
    ConstructorInfo ci = typeof(Test).GetConstructor(
     BindingFlags.NonPublic | BindingFlags.Static, null, new Type[] { }, null); 
    Console.WriteLine(ci is ConstructorInfo); // silly; writes True 
    Console.WriteLine(ci.IsConstructor);  // ??  writes False 
    } 
} 

static class Test 
{ 
    static Test() 
    { 
    Console.WriteLine("I am your static constructor"); 
    } 
} 

질문 : 왜? 버그 또는 불완전한 사양?

+0

정적 생성자가 개체의 생성자가 아닙니다. 용어가 잘못되었습니다. –

답변

5

"정적 생성자"는 실제로는 C# 용어입니다. .NET 자체에는 형식 초기화 자 (Type.TypeInitializer)이 있습니다. 형식은 C#에서 선언 된 정적 생성자가없는 형식 초기화자를 가질 수 있습니다. 정적 변수 초기화의 경우. 소스 C#에서 정적 생성자 데

두 효과가 있습니다

  • 그것은 잠재적 타이밍을 변경하는 형태에서 beforefieldinit 플래그를 제거하는 그것의 형식 이니셜
에 코드를 추가
  • ConstructorInfo으로 표시되는 동안 특히 IsConstructor은 CLR 용어의 생성자가 아니기 때문에 false가 반환된다는 사실에 놀라지 않습니다. 그것은 ConstructorInfo 객체로 표현 된 비 생성자입니다. 문서가 "이 메소드가 인스턴스 생성자 인 경우"라고 다시 쓰면 분명히 분명해질 것입니다. 또한 GetConstructor이 반환하지 않으면 (상당히 일관성이 없기 때문에) .

    이 메서드 오버로드를 사용하여 클래스 이니셜 라이저 (.cctor)를 얻으려면, 당신은 BindingFlags.Static | BindingFlags.NonPublic를 지정해야합니다 GetConstructor에 대한

    Addmittedly 워드 프로세서 상태를 않습니다. TypeInitializer 속성을 사용하여 클래스 이니셜 라이저를 가져올 수도 있습니다.

    ... 그래서 그들은 그것을 생성자라고 부르지 않습니다.

    +0

    그런데 용어가 혼란 스럽습니다. 속성'TypeInitializer'는 ... ConstructorInfo' 타입을 가지고 있습니다. 그래서 나 같은 누군가가 "타입 초기화"가 "생성자"라고 생각할 가능성이 있습니다. 그리고'typeof (Test) .TypeInitializer.MemberType'이 리턴하는 것이 무엇인지 알 수 있습니까? 'someMethod.IsConstructor'의 대안은'someMethod.MemberType == MemberTypes.Constructor' 일 수 있습니다. –

    +0

    @JeppeStigNielsen : 분명히 혼란 스럽 습니다만, 저는 동의합니다. 그리고 GetConstructor에 의해 리턴 된 사실은 실제로 도움이되지 않습니다. 아직도, 나는 그것이 * 이런 식으로 행동하는 이유라고 믿는다. –