2017-02-15 6 views
12

"C# 언어 사양. 버전 5.0"정적 생성자 섹션의 "10.12 정적 생성자"섹션은 "extern"한정자로 표시 될 수 있으며이 경우 외부 정적 생성자이라고합니다.C#에서 외부 정적 생성자의 용도는 무엇입니까?

일반 (비 외부) 정적 생성자는 잘 알려져 있습니다. 정적 필드 및 속성을 초기화하는 데 사용됩니다.

외부 정적 메서드는 종종 P/Invoke를 통해 네이티브 함수를 호출하는 데 사용됩니다.

그리고 나는 또한 매우 밀교 인 extern 생성자를 알고 있습니다 (this question도 참조하십시오). 예를 들어, String 클래스에는 이러한 declarations 등이 몇 개 있습니다. 이러한 생성자는 런타임에서 구현됩니다.

하지만 외부 정적 생성자의 실제 사용법은 무엇입니까? coreclr repo을 검색했지만 아무 것도 발견하지 못했습니다. 언어 명세는 결코 야생에서 사용되지 않은 구조에 대한 설명을 제공 할 수 없습니다. 아니면?

내 생각 엔 : C#은 CLR이 (기본적으로)이를 지원하기 때문에 외부 정적 생성자가 있습니다. MSDN에서

+0

10.6 (방법)에서 10.13 (소멸자)까지 섹션 10의 모든 하위 섹션에서 매우 비슷한 청크 텍스트를 찾을 수있을 것입니다. 그 밖의 것이 없다면 적어도 일관된 *입니다. –

+1

'extern'은 메서드의 RVA를 0으로 설정하는 것입니다. 런타임은 나머지를 알아낼 수 있습니다. http://stackoverflow.com/q/38015024/도 참조하십시오. 컴파일러의 작업이 사소한 것이기 때문에 이것을 금지하는 것은 언어 사양에 대한 이유가 거의 없습니다 (불법화하는 것이 더 많은 일입니다). 게다가 생성자가'DllImport'로 표시 될 수 없으므로 그러한 메소드를 구현하는 유일한 방법은'MethodImplOptions.InternalCall'입니다. 따라서 런타임이 유일하게 가능한 소비자이기 때문에 명시 적으로 금지하는 것이 더 재미 있습니다. –

+0

실제로 사용되지 않는 이유는 추측의 영역에 있습니다. 그러나 CLR 구현자인 경우 다소 정교한 규칙에 의존하기보다는 정적 초기화를 스포트를 예측하기 쉽도록 강하게 선호합니다 정적 유형의 초기화. 그 코드는 모두 런타임에 다시 호출되므로 아무 일도하지 않지만 내 작업을 더 어렵게 만듭니다. –

답변

1

는 :

생성자 선언은 통근 개질제를 포함

상기 생성자는 생성자 외부 것으로 알려졌다. 외부 생성자 선언은 실제 구현을 제공하지 않으므로 해당 생성자 본문은 세미콜론으로 구성됩니다.

은 ...

우리가 반드시 올바른이 선언하고 사용하는 좋은 이유 생각할 수 없다 보인다. 그러나 더 깊이 파고 들면 동적 조립 또는 코드 생성이라는 전 세계가 있다는 것을 깨닫게됩니다.

.NET 플랫폼 용 컴파일러를 개발하려는 경우 C# 컴파일러와 마찬가지로 일부 트릭이 필요한 솔루션이 필요할 수 있습니다. 일부 핵심 구현은 좋은 설계상의 이유로 다른 곳에서 구현되는 extern 생성자를 사용한다는 것을 알 수 있습니다.