C\#의 const,readonly 키 워드 를 깊이 연구 합 니 다.

우선 부인 할 수 없습니다.이런 것들 은 면접 에서 면접 관 에 게 자주 물 어 볼 수 있 지만 면접 관 이 만족 할 수 있 습 니까?물론 네가 이런 원 리 를 알 게 된다 면 아마 너 는 그렇지 않 을 것 이다.
무서워.원 리 를 말 한 이상 우 리 는 MSDN 부터 말 하 자.
1.퇴고 할 만 한 몇 가지 점
1.msdn 위 에서 const 에 대해 어떻게 말 하 는 지 먼저 보 세 요.우 리 는 볼 수 있 습 니 다.수정 할 수 없습니다.컴 파일 할 때 이 관건 적 인 정 보 를 상수 합 니 다.

Q:  const 는 왜 수정 되 지 않 습 니까?
A:이 건 아주 간단 합 니 다.많은 교과서 에서 컴 파일 러 가 컴 파일 될 때 상수 의 값 을 이 프로그램의 메타 데이터 에 저장 합 니 다.다음은 인 스 턴 스 를 만 들 겠 습 니 다.
봐 봐.
①:procject A 를 새로 만 듭 니 다.

// ProjectA
public class TestClass
{
     public const int CTRIP = int.MaxValue;
}
MainProject 를 하나 더 만 들 고 procject A 를 참조 합 니 다.

using System;

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(TestClass.CTRIP);

        Console.Read();
    }
}

그리고 우 리 는 mainproject 를 실행 합 니 다.

내 가 mainproject 를 뛰 기 시 작 했 고 Test.dll 도 인용 했다.아까 도 말 했 듯 이 컴 파일 할 때 상수 값 을 프로그램 집합 메타 데이터 에 저장 합 니 다.그러면 우 리 는...
찾 아 보 세 요.ILdasm.exe 를 열 고 Ctrl+M 을 엽 니 다.

안 타 깝 게 도 저 는 Ctrip 의 기 호 를 찾 지 못 했 고 int.MaxValue 도 찾 지 못 했 습 니 다.이른바 0x7ffffff f 도 찾 지 못 했 습 니 다.오히려 Assembly 의 일부 버 전 정보의 메타 데 이 터 를 찾 았 습 니 다.그러면 이 럴 때 당신 은 의심 할 수 있 습 니 다.도대체 const 의 값 이 Assembly 에 저장 되 었 습 니까?간단 한 검증 방법 은 Mainproject 아래 bin 의 Test.dll 을 삭제 하고 어떤 기적 이 일어 날 지 보 는 것 이다.


②:똑똑 한 당신 은 Demo.exe 를 실행 할 때 Test.dll 을 불 러 오지 않 고 Demo 의 Assembly 에서 const 값 을 직접 얻 을 수 있다 는 것 을 생각해 야 합 니 다.
그것 은 단층 적 인 일이 발생 할 수 있 습 니 다.즉,버 전이 일치 하지 않 는 상황 입 니 다.예 를 들 어 제 가 const 값 을 수정 한 다음 에 컴 파일 된 dll 을 Mainproject 의 bin 디 렉 터 리 에 복사 하여 Demo.exe 를 직접 실행 하면 MainProject 가 수 정 된 const 값 을 읽 지 못 하 는 것 이 아 닙 니까?여기 서 나 는 const 를 int.MinValue 로 바 꿀 것 이다.
다음은 우리 가 한번 해 볼 수 있다.

// ProjectA
public class TestClass
{
    public const int CTRIP = int.MinValue;
}

    
자,위의 결 과 를 보고 방금 말 한 것 을 증 명 했 습 니 다.const 는 확실히 Assembly 의 메타 데이터 에 저장 되 어 있 습 니 다.여기 서 Enum 은 본질 적 으로 const 이기 때문에 제 가 방금 말 한 단층 문제 도 존재 합 니 다.여기까지 말 하면 const 의 원리 에 대해 잘 알 고 있 을 것 이 라 고 생각 합 니 다.이제 Question 의 문 제 를 살 펴 보 겠 습 니 다.메타 데이터 인 데 메타 데이터 란 무엇 인가?"데 이 터 를 묘사 하 는 데 이 터 를 메타 데이터 라 고 합 니 다.기본 적 인 서술 적 데이터 인 이상 정 의 를 내 린 후에 결코 바 꿀 수 없습니다.이 정 의 는 msdn 이 말 한 컴 파일 일 때 so easy 가 아 닙 니까?
Q:  const 는 왜 인 스 턴 스 를 만 드 는 것 이 아니 라 정적 으로 만들어 야 합 니까?
A:  사실 첫 번 째 Question 에 대한 분석 을 통 해 우 리 는 많은 것들 이 갑자기 밝 아 질 것 이다.단층 의 문제 가 존재 하기 때문에 가장 좋 은 방법 은 const 의 값 이다.
영원히 변 하지 마 세 요.그러면 문제 의 발생 을 피 할 수 있 습 니 다.영원히 변 하지 않 는 것 이 니 당연히'유형'을 따라 가 는 것 이'인 스 턴 스'를 따라 가 는 것 보다 훨씬 좋 습 니 다.그 렇 죠?static 은 작은 캐 시 이기 때문에 new 를 따라 갈 필요 가 없습니다.
Q:readonly 필드 는 ctor 에서 만 초기 화 할 수 있 습 니까?

A:이 문 제 는 아주 재 미 있 습 니 다.우 리 는 readonly 의 뜻 이 필드 만 읽 는 다 는 뜻 을 알 고 있 습 니 다.우 리 는 일반적인 필드 가 읽 기와 쓰기 기능 을 가지 고 있다 는 것 을 알 고 있 습 니 다.
일단 컴 파일 러 가 뭐라고 하 는 지.

컴 파일 러 에서 볼 수 있 듯 이 readonly 의 초기 화 는'변수 초기 화'때 초기 화 할 수 있 습 니 다.그러면 Question 의 답 은 부정 적 이 어야 합 니 다.그런데 정말 그렇습니까?우 리 는 모두'문법 사탕'이라는 것 을 알 고 있 고 컴 파일 러 가 우리 에 게 제공 하 는 것 이기 때문에 진정 으로 무슨 일이 일 어 났 는 지 보고 싶 으 면 ILDasm.exe 로 컴 파일 러 를 뚫 고 무슨 일이 일 어 났 는 지 볼 수 밖 에 없다.

IL 에서 볼 수 있 듯 이 정말 컴 파 일 러 의 문법 사탕 이다.본질 적 으로 모두 ctor 에서 초기 화 된 것 이기 때문에 문 제 를 볼 때 절대 표면 을 보지 마라.
주:Stsfld 는 스 택 의 값 을 계산 하여 정적 필드 의 값 을 대체 합 니 다.

좋은 웹페이지 즐겨찾기