C #의 상수


9

컴파일러가 어셈블리 메타 데이터에 상수 값을 저장하는 이유는 무엇입니까? 어셈블리 메타 데이터에서 중급 언어 코드에 직접 포함되어 있습니까?


1
이것은 실제로 '이유'를 다루지는 않지만 그럼에도 불구하고 흥미 롭습니다. stackoverflow.com/a/2128633/128384
stijn

나는이 질문에 혼란 스럽다. 메타 데이터가 아닌 경우 어디에 저장 됩니까? 질문을 명확히 할 수 있습니까?
Eric Lippert

답변:


4

내가 생각하는 가장 좋은 방법은 다음과 같습니다. 컴파일 타임에 const가 사용되는 리터럴로 변환됩니다.

그것이 정의 된 어셈블리의 매니페스트에 들어가는 유일한 이유는 소비자가 액세스 할 수 있도록하기 위해서였습니다. 지정된 형식의 일부이며 해당 형식의 메타 데이터는 해당 형식의 메타 데이터가 해당 형식을 사용하는 어셈블리가 아닌 해당 어셈블리에 저장됩니다.

따라서 이는 인라인 리터럴이며 메타 데이터의 소비 가능한 유형 캡슐화 속성 또는 필드입니다.


2

나는 오랫동안 나 자신을 연구했고 이것이 책이 그 이유 일 수 있다는 것을 발견했다.

상수 값은 변경되지 않으므로 상수는 정의 유형의 일부로 간주됩니다. 따라서 상수를 정의하면 메타 데이터가 생성됩니다.


1

두 개의 어셈블리를 섞은 것 같습니다.

상수 는 정의 된 어셈블리 의 메타 데이터에만 저장 됩니다 . 메타 데이터에는 어셈블리의 모든 유형과 멤버에 대한 정보가 포함되며 상수는 멤버입니다.

상수에 대한 정보 는 사용 된 어셈블리에 저장되지 않습니다 . 상수 값은 소스에서 상수 번호 나 문자열을 직접 작성한 것처럼 IL에서 직접 사용됩니다.

예 : 내 응용 프로그램 중 하나가 많은 상수를 사용하여 데이터베이스 테이블과 필드를 식별합니다. 모든 상수 만 포함하는 하나의 어셈블리가 있습니다.

응용 프로그램을 빌드 할 때 Visual Studio의 "상수"어셈블리에 대한 참조를 추가합니다. 어셈블리에는 상수 만 포함되므로 내 응용 프로그램에는 해당 상수에 대한 참조가 없으며 "상수"어셈블리는 런타임에 필요하지 않습니다.


2
그러나 상수가 메타 데이터에 저장되는 이유를 실제로 설명하지는 않습니다. 이유를 중심으로 춤을 추지 만 OP가 두 개의 어셈블리를 혼란스럽게 생각하지는 않습니다. 두 개의 어셈블리를 사용하기 때문에이 어셈블리를 두 개의 어셈블리 문제로 간주하지만 연습이 일반적이라고 생각하지 않습니다. 상수는 일반적으로 사용되는 동일한 어셈블리에서 정의됩니다.
Robert Harvey

@RobertHarvey 전형적인 사례에 대한 귀하의 추정은 많은 기업 C # 동료의 기술을 과대 평가합니다. 저는 동료들에게 const가 무엇이고 왜 어셈블리를 통해 호출하지 않는지를 설명해야했습니다.
Jimmy Hoffa

1

상수는 컴파일 타임에 알려진 다음 어셈블리의 메타 데이터에 저장됩니다. 이는 기본 유형의 상수 만 정의 할 수 있음을 의미합니다.

예, 메타 데이터에서 직접로드됩니다. 런타임에는 메모리 할당이 없습니다.


1
10 진수는 기본 유형이 아니지만 10 진수 상수를 만들 수 있습니다. 상수가 null 인 경우 참조 유형의 상수를 만들 수 있습니다.
Eric Lippert
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.