질문 을 가지 고 CLR via C\#(필기 2)유형 기 초 를 읽 습 니 다.

6897 단어 CLRC#유형 기반
Q1:Object 유형 은 어떤 방법 을 포함 합 니까?
A1:Object 유형 은 모두 6 가지 방법,Equals,GetHashCode,ToString,GetType,MemberwiseClone 과 Finalize 를 포함한다.
Q2:new 대상 의 과정 은 무엇 입 니까?
A2:1)대상 이 필요 로 하 는 바이트 수 를 계산 합 니 다.이 유형 과 기본 형식 이 정의 하 는 모든 인 스 턴 스 필드 에 필요 한 바이트 수 와 유형 대상 포인터,동기 블록 색인 에 필요 한 바이트 수 를 포함 하고 유형 포인터 와 동기 블록 색인 은 CLR 로 대상 을 관리 합 니 다.2)위탁 관리 더미 에 이 대상 이 필요 로 하 는 메모리 공간 을 분배 한다.3)유형 대상 포인터 와 동기 블록 인덱스 초기 화;4)구조 함 수 를 집행 한다.대부분의 컴 파일 러 는 구조 함수 에서 코드 호출 기본 구조 함 수 를 자동 으로 생 성하 고 모든 유형의 구조 함수 가 실 행 될 때 이 유형의 정의 인 스 턴 스 필드 를 초기 화 합 니 다.5)새 대상 을 가리 키 는 인용 을 되 돌려 대상 변수 에 저장 합 니 다.
다음 코드 로 네 번 째 단 계 를 검증 할 수 있 습 니 다.

View Code
  class Program
     {
         static void Main(string[] args)
         {
             TestThree t = new TestThree();
             Console.Read();
         }
     }

     class Test
     {
         int i;
         public int I { get; set; }

         public Test()
         {
             Console.WriteLine("This is Test's constructor");
         }
     }

     class TestTwo : Test
     {
         public TestTwo()
         {
             Console.WriteLine("This is TestTwo's constructor");
         }       
     }

     class TestThree : TestTwo
     {
         public TestThree()
         {
             Console.WriteLine("This is TestThree's constructor");
         }
     }
실행 결 과 는 다음 과 같 습 니 다.

Q3:부모 유형 과 하위 유형 간 에 어떻게 전환 합 니까?
A3:C\#대상 을 자신의 유형 에서 부모 형식 으로 바 꿀 수 있 습 니 다.이것 은 안전 합 니 다.추가 작업 을 할 필요 가 없 지만 대상 을 자신의 유형 에서 하위 형식 으로 바 꾸 려 면 명시 적 으로 바 꿔 야 합 니 다.실패 할 수 있 기 때 문 입 니 다.코드 참조:

View Code
  class Program
     {
         static void Main(string[] args)
         {
             Person person = new Person();
             Man man = new Man();
             Person p = man;
             Man m = person;
         }
     }

  class Person
     { }

  class Man : Person
     { }
이 코드 는 컴 파일 할 수 없습니다.Main 방법의 네 번 째 줄 에서 이러한 오 류 를 보고 합 니 다.
Error 1 Cannot implicitly convert type 'TypeBasic.Person' to 'TypeBasic.Man'. An explicit conversion exists (are you missing a cast?) C:\Users\Allen\Documents\Visual Studio 2012\Projects\TypeBasic\TypeBasic\Program.cs 16 21 TypeBasic
분명 한 것 은'남자'가 반드시 한 사람 이기 때문에 직접적 으로 전환 할 수 있 지만'사람'이 반드시'남자'가 아니 기 때문에 반드시 명시 적 으로 전환 해 야 한다.코드 를 이렇게 고 칠 수 있 습 니 다:

// From
Man m = person;

// To
Man m = (Man)person;    

이렇게 하면 컴 파일 을 성공 적 으로 통과 할 수 있 지만 실행 할 때 이상 을 던 졌 습 니 다.Person 이 man 으로 바 뀔 수 없 음 이 분명 합 니 다.어떤 상황 에서 Person 이 Man 으로 바 뀔 수 있 습 니까?다음 코드 참조:

View Code
         static void Main(string[] args)
         {
             Man man = new Man();
             Test(man);
         }

         static void Test(Person p)
         {
             Man m = (Man)p;
         }
Q4:is 와 as 연산 자의 역할 은 무엇 입 니까?
A4:is 조작 부 호 는 대상 이 어떤 유형 에 속 하 는 지 판단 하고 불 값 을 되 돌려 줍 니 다.상례 의 Test 방법 을 고 쳐 쓰다.
상기 코드 는 모두 두 번 의 유형 검 사 를 실 시 했 습 니 다.is 조작 자 는 먼저 p 가 Man 유형 인지,if 의 방법론 에서 강제 전환 을 할 때 CLR 은 p 의 유형 을 다시 검 측 합 니 다.이것 은 성능 에 어느 정도 영향 을 줍 니 다.
as 연산 자 는 이 문 제 를 잘 해결 하고 다시 Test 방법 을 고 쳤 습 니 다.
as 조작 부 호 는 p 의 종 류 를 검출 한 후 p 에 대해 직접 종 류 를 변환 하고 Man 형식의 대상 을 되 돌려 줍 니 다.p 가 Man 형식 이 아 닌 것 이 검출 되면 null 로 돌아 갑 니 다.전체 과정 에서 한 번 만 종 류 를 검출 했 습 니 다.
Q5:네 임 스페이스 가 무엇 입 니까?
A5:네 임 스페이스 는 유형 에 대한 논리 적 그룹 입 니 다.컴 파일 러 에 있어 네 임 스페이스 의 역할 은 유형 이름 을 길 고 유일 하 게 만 드 는 것 입 니 다.그러나 CLR 은 네 임 스페이스 를 모 릅 니 다.한 유형 에 접근 할 때 CLR 은 이 유형의 전체 이름과 프로그램 집합 을 알 아야 합 니 다.
Q6:네 임 스페이스 와 프로그램 집합 간 의 관 계 는 무엇 입 니까?
A6:네 임 스페이스 와 프로그램 집합 은 아무런 관련 이 없습니다.같은 네 임 스페이스 의 유형 은 서로 다른 프로그램 집합 에 존재 할 수 있 고 같은 프로그램 이 집 중 된 유형 도 서로 다른 네 임 스페이스 에 속 할 수 있 습 니 다.
Q7:다음 코드 가 실 행 될 때 CLR 에서 발생 하 는 동작 을 분석 합 니 다.

View Code
 static void Test(Person p)
 {
     if (p is Man)
     {
         Man m = (Man)p;
     }
 }
A7:
1)CLR 은 이 방법 내부 에서 인 용 된 모든 유형(Employee,Int 32,Manager,String)을 검사 하여 이 유형의 프로그램 집합 이 성공 적 으로 불 러 왔 는 지 확인 합 니 다.
2)CLR 은 프로그램의 메타 데 이 터 를 이용 하여 이러한 유형의 관련 정 보 를 추출 하고 데이터 구 조 를 만들어 유형 자 체 를 나타 낸다.다음 그림 과 같다.

3)"서막 코드"를 실행 합 니 다.온라인 스 택 에서 부분 변수 에 메모 리 를 할당 하고 초기 화 합 니 다.다음 그림 과 같 습 니 다.

4)관리자 대상 을 구축 하고 트 랜 잭 션 더미 에 관리자 형식의 인 스 턴 스 를 만 듭 니 다.CLR 은 이 인 스 턴 스 의 유형 대상 지침 을 초기 화하 여 인 스 턴 스 와 대응 하 는 유형 대상 을 참조 하도록 합 니 다.이 예 는 Manager 형식 대상 입 니 다.또한 CLR 은 동기 블록 인덱스 를 초기 화하 고 이 인 스 턴 스 의 모든 인 스 턴 스 필드 를 null 또는 0 으로 설정 한 다음 구조 함 수 를 호출 합 니 다.new 작업 자 는 이 인 스 턴 스 메모리 주 소 를 되 돌려 줍 니 다.이 주 소 는 e 에 저 장 됩 니 다.다음 그림:

5)Lookup 은 정적 방법 입 니 다.호출 할 때 CLR 은 정적 방법의 유형 에 대응 하 는 유형 대상 을 지정 한 다음 에 JIT 컴 파일 러 는 이 유형의 대상 방법 표 에서 호출 된 방법의 기록 항목 을 찾 아 JIT 컴 파일(첫 번 째 실행)을 하고 컴 파일 된 코드 를 실행 합 니 다.이 예 에서 찾 아 낸 인 스 턴 스 가 i 액 Manager 형식 이 라 고 가정 하면 더미 에 Manager 인 스 턴 스 를 만 들 고 찾 아 낸 정보 로 이 인 스 턴 스 를 초기 화하 고 주 소 를 e 에 저장 합 니 다.이때 첫 번 째 초기 화 된 Manger 대상 은 포인터 가 가리 키 지 않 고 쓰레기 회수 대상 이 됩 니 다.다음 그림 참조:

6)GetYearsLookup 은 비 가상 인 스 턴 스 방법 으로 호출 할 때 JIT 컴 파일 러 는 호출 된 스칼라(e)의 유형 에 대응 하 는 유형 대상 을 찾 습 니 다.이 예 는 Employee 유형 대상 입 니 다.e 는 Employee 유형 으로 정의 되 기 때 문 입 니 다.Employee 에서 이 방법 이 정의 되 지 않 으 면 위 에서 계속 찾 습 니 다.Object 형식 대상 을 찾 았 다 는 것 을 알 고 이 방법 을 찾 은 후 JIT 컴 파일 러 는 이 를 컴 파일(첫 번 째 실행)하고 변 이 된 코드 를 실행 하여 실행 결 과 를 부분 변수 에 저장 합 니 다.다음 그림 참조:

7)GetProgress Report 는 Employee 에서 의 가상 방법 을 정의 하기 위해 가상 방법 을 호출 합 니 다.JIT 컴 파일 러 는 방법 에서 추가 코드 를 생 성 합 니 다.이 코드 들 은 호출 방법 마다 실 행 됩 니 다.이 는 먼저 호출 된 변 수 를 감지 하고 주소 에 따라 호출 된 인 스 턴 스 를 찾 습 니 다.이 예 는 Manager 대상 이 고 대상 내부 의 유형 지침 을 검사 하여 대상 의 실제 유형 을 찾 습 니 다.실제 유형 대상 의 방법 목록 에서 호출 된 방법의 기록 항목 을 찾 아 JIT 컴 파일(첫 번 째 실행)을 하고 변 이 된 코드 를 실행 합 니 다.다음 그림 참조:

Q8:유형 대상 을 어떻게 이해 합 니까?
A8:유형 대상 도 본질 적 으로 대상 이 고 유형 대상 포인터 구성원 도 포함 되 어 있 으 며 CLR 이 이러한 유형 대상 을 만 들 때 초기 화 됩 니 다.CLR 이 한 프로 세 스에 서 실행 되 기 시작 하면 MSCorLib.dll 에서 정의 하 는 System.Type 대상 에 게 특수 한 유형 대상 을 만 듭 니 다.Q7 의 Emloyee 와 Manager 는 모두 Type 형식의'인 스 턴 스'입 니 다.이들 의 유형 대상 지침 은 Type 유형의 대상 을 가리 키 고 Type 유형의 대상 의 유형 대상 지침 은 자신 을 가리 킵 니 다.

좋은 웹페이지 즐겨찾기