익명 형식은 명명된 형식을 먼저 정의하지 않고 읽기 전용 속성 집합을 단일 개체로 캡슐화하는 편리한 방법을 제공합니다. 컴파일러는 소스 코드에서 액세스할 수 없는 형식 이름을 컴파일 시간에 생성합니다. 컴파일러는 각 속성의 형식을 유추합니다.
연산자를 new 개체 이니셜라이저와 함께 사용하여 익명 형식을 만듭니다. 익명 형식의 예시는 속성 두 개 (Name 및 Age)로 초기화된 형태입니다.
var person = new { Name = "Alice", Age = 30 };
Console.WriteLine($"{person.Name} is {person.Age} years old.");
// Output:
// Alice is 30 years old.
유추된 속성 이름
구문을 사용하여 Name = value 속성 이름을 명시적으로 지정할 수 있습니다. 변수 또는 멤버 액세스 식을 사용하여 익명 형식을 초기화하면 컴파일러는 해당 식의 속성 이름을 유추합니다.
string productName = "Laptop";
decimal price = 999.99m;
var product = new { productName, price };
Console.WriteLine($"{product.productName}: {product.price:C}");
// Output:
// Laptop: $999.99
앞의 예제에서 컴파일러는 이니셜라이저에 사용된 변수 이름을 속성 이름으로서 유추합니다 productNameprice.
var을 사용하여 익명 형식 선언
컴파일러가 형식 이름을 생성하고 소스 코드에서 액세스할 수 없으므로 로컬 변수를 선언하는 데 사용해야 var 합니다. 형식 이름을 명시적으로 지정할 수 없습니다.
// You must use var — you can't write a named type here.
var person = new { Name = "Alice", Age = 30 };
LINQ 쿼리에서 익명 형식 사용
익명 형식은 쿼리 식의 절에 select 가장 자주 나타나며 각 원본 요소에서 속성의 하위 집합을 프로젝스합니다.
var words = new[] { "apple", "blueberry", "cherry" };
var results = words.Select(w => new { Word = w, Length = w.Length });
foreach (var item in results)
{
Console.WriteLine($"{item.Word} has {item.Length} letters.");
}
// Output:
// apple has 5 letters.
// blueberry has 9 letters.
// cherry has 6 letters.
평등성
동일한 순서의 속성 이름과 형식을 가진 두 개의 익명 형식 인스턴스는 동일한 컴파일러 생성 형식을 공유합니다. 컴파일러가 Equals과GetHashCode을(를) 재정의하여, 참조 식별자가 아니라 속성 값을 비교하는 동등성을 제공합니다.
var a = new { Name = "Alice", Age = 30 };
var b = new { Name = "Alice", Age = 30 };
var c = new { Name = "Bob", Age = 25 };
Console.WriteLine(a.Equals(b)); // True
Console.WriteLine(a.Equals(c)); // False
중첩된 무명 형식
익명 형식은 다른 익명 형식을 속성 값으로 포함할 수 있습니다.
var order = new
{
OrderId = 1,
Customer = new { Name = "Alice", City = "Seattle" },
Total = 150.00m
};
Console.WriteLine($"Order {order.OrderId} for {order.Customer.Name} in {order.Customer.City}");
// Output:
// Order 1 for Alice in Seattle
특징
무명 형식에는 다음과 같은 특징이 있습니다.
- 컴파일러는 Object에서 파생된
internal sealed class형식으로 이를 생성합니다. - 모든 속성은
public읽기 전용입니다. - 무명 형식은 비파괴적 변이에 대한
with식을 지원합니다. - 컴파일러는 값 기반 Equals, GetHashCode, 및 ToString 재정의를 생성합니다.
- 익명 형식은 식 트리를 지원하지만 튜플은 지원하지 않습니다.
제한점
익명 형식에는 다음과 같은 몇 가지 제한 사항이 있습니다.
- 형식의 이름을 지정할 수 없으므로 메서드 반환 형식, 메서드 매개 변수 또는 필드 형식으로 사용할 수 없습니다.
- 선언된 메서드 내에서 범위가 지정된 변수입니다.
- 메서드, 이벤트 또는 사용자 지정 연산자를 추가할 수 없습니다.
- 속성은 항상 읽기 전용입니다. 무명 형식은 변경 가능한 속성을 지원하지 않습니다.
대신 튜플을 사용하는 경우
대부분의 새 코드에서는 익명 형식 대신 튜플을 사용하는 것이 좋습니다. 값 형식으로 튜플은 더 나은 성능을 제공합니다. 또한 분해 지원 및 보다 유연한 구문을 제공합니다. 익명 형식은 식 트리 지원 또는 참조 형식 의미 체계가 필요한 경우 더 나은 선택으로 유지됩니다. 자세한 비교는 익명 형식과 튜플 형식 중에서 선택 항목을 참조하세요.
참고하십시오
.NET