복잡한 메서드, 이벤트, 구성자 같은 복잡한 클래스를 정의하고 싶지 않을 때는 -> 익명 타입으로 커스텀 데이터 타입을 동적으로 생성할 수 있습니다.
1. 익명성의 유형을 정의한다
익명 타입을 정의할 때는 var 키워드와 객체 초기화 구문을 사용해야 합니다.
var: 컴파일러가 컴파일 시점에 자동으로 새로운 클래스 정의를 생성합니다(C# 코드에서 클래스 이름은 보이지 않습니다).
초기화: 컴파일러가 새로 생성된 타입에 대해 개인 배경 필드와 (읽기 전용) 속성을 생성하도록 지시합니다.
매개변수를 전달하여 익명 타입을 구성하고 관련 정보를 출력합니다
콜: 익명 타입도 하드코드를 사용해 만들 수 있습니다
2. 익명 타입의 내부 표현
모든 익명 타입은 Object에서 자동으로 상속되기 때문에, 자동차 객체에 ToString, GetHashCode, Equals를 사용할 수 있습니다. 이렇게 호출해 보겠습니다:
판정 및 결과:
car 객체의 타입은 다음과 같습니다: <>f__AnonymousType03 (당신의 것은 다를 수 있습니다), 익명 타입 이름은 컴파일러가 감지하고 간섭할 수 없으며, CIL 코드입니다.
3. 메서드 ToString()과 GetHashCode() 구현.
1.ToString()
2. 해시코드 획득()
각 익명 타입의 변수를 사용하여 System.Collections.Generic.EqualityComparer의 타입 입력으로 해시 값을 계산하며, <T>두 익명 타입이 동일한 속성을 가지고 동일한 값을 부여할 때만 동일한 해시 값을 생성합니다.
4. 익명 타입의 동등 의미
이른()
결과를 분석하세요:
1. Equals(): 컴파일러는 Equals()를 덮어써 값 의미론에 따라 객체가 같은지 판단합니다(예: 두 객체의 각 데이터 멤버의 값을 기록)
2. == 연산자: 익명 타입은 동등한 연산자를 과부하하지 않기 때문이다 (== , !=), == 참조를 비교하지, 내용이 아닌 참조를 비교한다.
3. GetType(): 동일한 어셈블리에서 동일한 속성의 익명 타입 두 개를 선언하면, 컴파일러는 하나의 익명 타입만 정의합니다.
5. 익명 타입을 포함하는 익명 타입
요약:
사실, 익명 타입 사용, 특히 LINQ를 사용할 때는 신중해야 하며, 익명 타입의 등장 때문에 강한 타입 클래스나 구조 사용을 포기해서는 안 됩니다.
사실 익명 타입 자체에도 많은 한계가 있습니다:
- 익명 타입의 이름을 통제할 수는 없습니다
- 익명 타입은 System.Object 상속을 받습니다
- 익명 필드와 속성 유형은 항상 읽기 전용입니다
- 익명 타입은 이벤트, 커스텀 메서드, 커스텀 연산자, 커스텀 리라이트를 지원하지 않습니다
- 익명 유형은 암묵적으로 밀봉되어 있습니다
- 익명 타입의 엔티티 생성은 기본 구성자만을 사용합니다
기능을 정의하지 않고 엔터티의 형태를 빠르게 정의해야 한다면, 익명 타입을 사용할 수 있습니다. |