제프리 리처의 CLR via C# 2부 타입 설계 part.1
4장 타입
System.Object
.Equals()
.GethashCode()
.ToString()
.GetType()
namespace에 비슷한 타입끼리 grouping
is, as 연산자는 Exception을 발생시키지 않음
//is as 사용 예시
if(a is AClass)
BClass = a as BClass
Object o = new AClass();
o.ToString(); //컴파일 에러는 나지 않음. 런타임 에러 발생 NullReferenceException
CLR이 메서드 실행에 필요한 모든 타입 객체 생성
함수단위로 처음 불려질때 JIT컴파일러가 컴파일
5장 기본, 참조, 값타입
기본 타입 선언
//두 구문은 동일
System.Int32 a = new System.Int32();
int a = 0;
값타입은 System.ValueType을 상속
FCL(Framework Class Library)
.NET에서 제공하는 클래스, 타입, 인테페이스 등을 포함
Object 최상위 오브젝트로 다른 타입으로 갈 때 박싱 발생
var 컴파일러가 타입을 유추, 박싱 발생 안함
dynamic 컴파일러가 아닌 런타임에 타입을 확정지음, - 올바르지 않은 타입이 지정되더라도 런타임시점에 에러가 생김
참조 타입은 기본적으로 타입 객체 포인터, 동기화 블록 인덱스 2개의 추가필드가 자동으로 할당되어 값 타입 보다 무겁다.
Equals를 재정의할때 GetHashCode(객체 해시코드)도 재정의
return 멤버1 ^ 멤버2 //XOR연산
readonly 키워드 멤버변수에 필요할때 사용.
성능 향상을 위해 CLR이 타입 안의 필드들에 대한 메모리 레이아웃 정리
박싱 언박싱에 대한 상황들
ToString() 호출
GetType() 호출
CompareTo() 첫 호출
IComparable로 캐스팅
... 많지만 이정도로
6장, 7장 기본 참조/값 타입, 타입과 멤버
const 상수를 선언하는것은 static변수를 선언 하는 것과 같다.
필드는 생성자의 변수들(프로퍼티 X)
volatile : 컴파일러 CLR, 하드웨어에 의해 지워지는 스레드 비안정성 최적화의 대상에서 제외
ILDASM.exe : 디스어셈블러 exe나 dll 의 클래스 내용을 볼수 있다.
CLR의 많은 지원기능중 몇가지를 C#에서 빼서 씀
CLR과 C# 사이 용어간의 차이가 있음.