2014-11-07 2 views
2

코드에서 참조하는 상수는 IL로 컴파일 될 때 실제 값으로 대체됩니다.private 어셈블리가 .NET 어셈블리에 저장되는 이유는 무엇입니까?

공용 상수는 특정 어셈블리 외부의 코드에서 참조 할 수 있으므로 어셈블리의 메타 데이터에 저장된다는 것이 좋습니다.

왜 개인 상수가 저장되어 있습니까? 어셈블리에서 IL을 정의한 코드의 해당 상수에 대한 참조는 없으며 어셈블리 외부에서 참조되도록 노출되지 않습니다.

그래서 코드를 컴파일 한 후에 그 값에 액세스해야합니까?

어셈블리의 모든 상수는 public이어야하며 private 상수는 단순히 컴파일러에서 리터럴 값을 내보내는 언어 수준의 기능이어야합니다.

+1

BindingFlags.NonPublic 때문에. 사적인 부분을 찌를 수있는 것은 당신이 구속력이 있고 프로그래머가 전화를 받아서 도움을 줄 때 편리합니다. –

+0

하지만 그 개인 상수에 대한 액세스는 어떤 용도로 사용됩니까? IL은 상수를 참조하지 않습니다. 누군가는 누군가가 어딘가에서 값을 하드 코딩하는 대신 상수를 사용하기로 결정했다는 것을 말해줍니다. – user2465452

+0

물론 "IL은 그 상수를 참조합니다". 그것은 일리노이에 내장되어있다. 당신이 그것을 사용하지 않는다면 인생은 좋습니다. –

답변

3

C# 컴파일러는 모든 종류의 개인 자료를에 최적화 할 수 있습니다. 상수 뿐만이 아닙니다. 사용되지 않는 멤버, 클래스, 코드를 제거 할 수 있습니다. 그것은 개인적인 이름을 벗길 수 있습니다. 개인 속성을 삭제하고 메서드로 바꿀 수 있습니다.

반사 액세스 및 일리노이 다시 쓰기 도구은 사적인 물건의 중요한 사용 사례로 떠오릅니다. 또한 대부분의 메타 데이터가 여전히 존재할 때 디버깅이 쉬워집니다. 예를 들어, 편집 & 이전에 사용하지 않은 멤버를 계속 사용할 수 있습니다. 직접 실행 창을 사용하여 정적으로 사용되지 않는 멤버를 호출 할 수 있습니다.

PDB 심볼에도 의미가 있을지 모르지만 나는 지금 당장 생각할 수 없습니다.

.NET 어셈블리에는 반사 액세스에 유용한 인 많은 메타 데이터가 들어 있습니다. 속성은 검사 할 수있는 것 이외에는 런타임시 영향을 미치지 않습니다. 어셈블리는 풍부하고 자체 설명하기위한 것입니다.

항상 정적으로 사용하지 않기 때문에 상수는 유지하는 것이 특히 쓸모가 없다고 주장 할 수 있습니다. 그렇다고 반사 용도가 없다는 의미는 아닙니다. 또한 코드 디 컴파일과 도울 수 있습니다. 스마트 디 컴파일러는 특정 리터럴이 근처에 선언 된 상수와 동일하다는 것을 알 수 있습니다. 게다가, 왜 그것들을 멀리 떨어 뜨리기 위해서 상수에 대한 예외를 만들까요? 전형적인 프로그램에는 거의 상수가 없습니다. 그것들을 제거하는 것이 더 나을 것이라고 가정한다고하더라도 투자는 거의 성과가 없을 것입니다. 같은 시간에 유용한 언어 기능을 더 효과적으로 개발할 수 있습니다.

+0

Reflection은 상수가 사용되었지만 그 상수는 IL 코드에서 참조되지 않는다고 말할 수 있습니다. 컴파일러는 이미 참조 된 곳 어디에서나 리터럴을 삽입하여 상수를 "최적화"하고 있습니다. 다른 개인 회원은 리플렉션을 통해 액세스 할 수 있으므로 메타 데이터에 정보가 저장되는 것이 좋습니다. 그러나 상수로부터 얻는 것은 프로그래머가 사용하기로 결정한 지식입니다.속성은 공개되어 있으며 자동으로 그렇게하지 않더라도 논리에 영향을주기 위해 프로그래밍 방식으로 액세스 할 수 있습니다. – user2465452

+0

그것에 대해 몇 가지 언급을 추가했습니다. – usr

+0

일치하는 값을 가진 리터럴이 동일한 상수를 참조한다고 추측하면 너무 오류가 발생하기 쉽습니다. 예를 들어 상수'private const int SCHEMAVERSION = 1'을 선언하면 디 컴파일러는이 코드를'var x = myarray [myarray.Length - 1]'에 매핑 할 것입니다. var x = myarray [myarray.Length - SCHEMAVERSION ]'. 그리고 나서 로컬 상수가 동일한 값을 가짐에도 불구하고 외부 공용 상수를 참조하는 경우가 있습니다. 그들이 그것을 지원하기를 원한다면, 나는 상수에 대한 일리노이 지침을 지원하고, 지터가 리터럴을 주입하게 할 것이라고 생각했을 것이다. – user2465452

관련 문제