C #이 const 변수를 해당 값으로 바꾸는 것을 중지하는 방법은 무엇입니까?
다음과 같은 내용을 포함하는 consts.dll이라는 DLL로 컴파일 된 프로젝트가 있습니다.
public static class Consts
{
public const string a = "a";
public const string b = "b";
public const string c = "c";
}
우리는 이런 종류의 여러 프로젝트를 가지고 있으며, 각 프로젝트는 같은 이름 (consts.dll)의 DLL로 컴파일되며 필요에 따라 대체합니다. 이러한 const를 사용하는 또 다른 클래스가 있습니다.
public class ConstsUser
{
string f() { return Consts.a; }
}
안타깝게도 Consts.a는 "a"에 최적화되어 있으므로 Consts.dll 구현을 대체하더라도 올바른 값 대신 "a"가 표시되고 다시 컴파일해야합니다 ConstsUser. 어쨌든 옵티마이 저가 const 변수를 값으로 바꾸지 못하도록 막을 수 있습니까?
static readonly수정 자의 사용이 귀하의 요구에 맞다고 생각 합니다.
public static class Consts
{
public static readonly string a = "a";
public static readonly string b = "b";
public static readonly string c = "c";
}
상수는 호출 사이트에서 하드 코딩되므로 이것이 문제입니다. 정적 읽기 전용 변수는 변수 선언 또는 Consts클래스의 정적 생성자에서만 수정할 수 있으며 호출 사이트에서 인라인되지 않습니다.
코드가 상수 기호를 참조하면 컴파일러는 상수를 정의하는 어셈블리의 메타 데이터에서 기호를 조회하고 상수 값을 추출한 다음 내 보낸 IL (중간 언어) 코드에 값을 포함합니다 . 상수의 값이 코드에 직접 포함되기 때문에 상수 는 런타임에 할당 할 메모리가 필요하지 않습니다 . 또한 상수의 주소를 가져올 수 없으며 참조로 상수를 전달할 수 없습니다. 이러한 제약은 또한 상수에 좋은 교차 어셈블리 버전 관리 스토리가 없음을 의미하므로 심볼의 값이 절대 변경되지 않는다는 것을 알고있는 경우에만 사용해야합니다 .
보시 const다시피, 심볼의 가치가 절대 변하지 않는다는 것을 알 때 사용 은 이점이 있습니다. CLR이 값을 확인할 필요가 없기 때문에 더 빠르게 수행 할 수 있습니다.
실제로 응용 프로그램 어셈블리를 빌드 한 후 DLL 어셈블리는 런타임에로드되지 않으며 컴파일러가 응용 프로그램의 메타 데이터에 DLL 어셈블리에 대한 참조를 추가하지 않기 때문에 디스크에서 삭제할 수 있습니다.
@Sergey Berezovskiy가 이미 제안했듯이 런타임시 동적으로static readonly 값을 확인하기 위해 CLR이 필요한 경우 사용할 수 있습니다 . 이 솔루션은 성능에 영향을 주지만 또 다른 이점도 있습니다.
또한 필드는 모든 데이터 유형이 될 수 있으므로 상수에 대해 수행하는 것처럼 컴파일러의 기본 제공 기본 유형으로 제한 할 필요가 없습니다.
'IT TIP' 카테고리의 다른 글
| 배열 유형과 malloc으로 할당 된 배열의 차이점 (0) | 2020.11.29 |
|---|---|
| Java에서 임의의 부울 가져 오기 (0) | 2020.11.29 |
| org.eclipse.jetty : jetty-maven-plugin으로 서버 포트를 설정하는 방법은 무엇입니까? (0) | 2020.11.29 |
| 지도를 가질 수있는 좋은 방법이 있습니까? (0) | 2020.11.29 |
| list :: size () 정말 O (n)입니까? (0) | 2020.11.29 |