개발 공부 유니티, C#/스터디

제프리 리처의 CLR via C# 2부 타입 설계 part.1

와디더 2023. 6. 25. 20:36

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# 사이 용어간의 차이가 있음.