이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 31028|회답: 1

[출처] .ctor와 .net의 .cctor

[링크 복사]
게시됨 2017. 4. 6. 오후 2:56:38 | | | |
.ctor는 모두에게 알려져 있습니다

.cctor는 익숙하지 않으며 쉽게 오용될 수 있습니다

이른바 .cctor는 C# 문법으로 된 정적 생성자입니다

모양은 다음과 같습니다




.cctor와 .ctor 간의 유사점과 차이점

   1. 접근 권한 식별자를 공개, 비공개 등으로 설정할 수 없으며, 이는 .ctor와 다릅니다

   2. 반환값이 없어야 하며, 이는 .ctor와 동일합니다

   3. 매개변수가 없을 수 있으며, .ctor는 여러 매개변수를 가질 수 있습니다

   4. 최대 하나만 존재할 수 있으며, 최소 하나의 .ctor가 있어야 합니다

   5. 프로그래머는 .cctor 호출의 타이밍을 제어할 수 없지만, 어떤 의미에서는 호출 타이밍을 제어할 수 있습니다

   6. 프로그래머는 .cctor, .ctor를 직접 호출할 수 없습니다. 프로그래머가 새 연산자를 사용할 때, .ctor는 반드시 호출됩니다


.cctor 통화 타이밍:


    정적 생성자는 첫 인스턴스가 생성되거나 정적 멤버가 참조되기 전에 자동으로 호출됩니다. (이 내용은 MSDN의 원본 인용문입니다)

    .cctor는 .ctor처럼 객체가 인스턴스화될 때마다 호출되는 것이 아니라 동일한 프로그램 도메인 내에서 한 번만 호출된다는 점이 분명합니다

.cctor 사용

    정적 생성자는 정적 데이터를 초기화하거나 한 번만 수행하면 되는 특정 연산을 수행하는 데 사용됩니다.


예를 들어:

다음 코드들은 Windows 7에서 컴파일되었으며, 2005 릴리스 모드와 비교해 사용 후 결과가 다르면 릴리스 모드로 전환해 다시 시도해 보세요




이 코드 구간을 컴파일한 후 ILDISM을 사용해 보면, 메서드 테이블은 다음과 같습니다



.ctor(): void // 이것은 컴파일러가 자동으로 제공하는 클래스의 인스턴스 생성자입니다

Main():void(string[]) //Program 진입점

분명히 어셈블리에는 .cctor가 없고, 클래스에 정적 필드가 없으면 .cctor 함수를 자동으로 제공하지 않습니다. .ctor는 항상 존재하는 것과 다릅니다

코드를 수정하세요




이 코드를 컴파일할 때 경고가 뜨겠지만, 그것은 중요하지 않습니다. 중요한 것은 ILDASTOM으로 어셈블리를 볼 때 예상되는 .cctor 정적 생성자가 나타나지 않는다는 점입니다!


무슨 일이 있었나요?

그 추론이 잘못된 걸까요? CCTOR는 클래스 초기화에 사용되는 정적 필드가 아닌가요?

진정하세요, 코드 좀 보세요





이 코드와 이전 코드의 유일한 차이점은 정적 필드 i의 초기 값을 바꾸고, 다음으로 마법 같은 순간을 목격한다는 점입니다

이제 DASM 처리해 봅시다가, 놀랍게도 많이 요청받던 .cctor가 드디어 등장했습니다!



.cctor 구현 코드를 보면 다음과 같은 내용을 알 수 있습니다:

.method private hidebysig specialname rt specialname static
        void .cctor() cil managed
{
  코드 크기 7 (0x7)
  .맥스택 8
  IL_0000: ldc.i4.1 // 정적 필드를 인스턴스화하세요 :-)
  IL_0001: stsfld int32 only_lonely. A::i
  IL_0006: 예비
} // 메서드 A::.cctor 종료


왜 그럴까요? 가능한 이유는 Int32 타입의 기본 값이 0이고, 컴파일러가 이를 감지하여 .cctor 코드를 생성하지 않도록 최적화하기 때문입니다

참조
https://msdn.microsoft.com/zh-cn/library/k9x6w0hc(VS.80).aspx

마지막으로, 특별한 기능 요구사항을 구현하기 위해 .cctor 함수를 직접 구현할 수 있습니다

요약
1、. ctor는 구성 방법이며;
2、. cctor는 C#에서 정적 생성자인 타입 초기화자이며;
3. 클래스 C가 인스턴스화될 때, 선언 시점에 할당된 필드에 먼저 값을 할당한 뒤, 기본 클래스의 창조자를 호출한 뒤, 같은 방식으로 최상위 System.Object까지 직접 생성합니다. 그리고 다시 C의 명시적 구성 메서드로 코드를 실행하는데, 이 메서드는 매우 재귀적인 과정입니다.





이전의:일반적인 컨텍스트 바운드 객체: ContextBoundObject 및 제네릭 클래스는 지원되지 않습니다
다음:클래스 내 정적, 비정적, 구성적 메서드의 실행 순서 요약
면책 조항:
Code Farmer Network에서 발행하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 학습 및 연구 목적으로만 사용됩니다; 위 내용은 상업적 또는 불법적인 목적으로 사용되지 않으며, 그렇지 않으면 모든 책임이 사용자에게 부담됩니다. 이 사이트의 정보는 인터넷에서 가져온 것이며, 저작권 분쟁은 이 사이트와는 관련이 없습니다. 위 내용은 다운로드 후 24시간 이내에 컴퓨터에서 완전히 삭제해야 합니다. 프로그램이 마음에 드신다면, 진짜 소프트웨어를 지원하고, 등록을 구매하며, 더 나은 진짜 서비스를 받아주세요. 침해가 있을 경우 이메일로 연락해 주시기 바랍니다.

Mail To:help@itsvse.com