다음을 통해 공유


익명 형식(C# 프로그래밍 가이드)

익명 형식은 명명된 형식을 먼저 정의하지 않고 읽기 전용 속성 집합을 단일 개체로 캡슐화하는 편리한 방법을 제공합니다. 컴파일러는 소스 코드에서 액세스할 수 없는 형식 이름을 컴파일 시간에 생성합니다. 컴파일러는 각 속성의 형식을 유추합니다.

연산자를 new 개체 이니셜라이저와 함께 사용하여 익명 형식을 만듭니다. 익명 형식의 예시는 속성 두 개 (NameAge)로 초기화된 형태입니다.

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.

평등성

동일한 순서의 속성 이름과 형식을 가진 두 개의 익명 형식 인스턴스는 동일한 컴파일러 생성 형식을 공유합니다. 컴파일러가 EqualsGetHashCode을(를) 재정의하여, 참조 식별자가 아니라 속성 값을 비교하는 동등성을 제공합니다.

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 재정의를 생성합니다.
  • 익명 형식은 식 트리를 지원하지만 튜플은 지원하지 않습니다.

제한점

익명 형식에는 다음과 같은 몇 가지 제한 사항이 있습니다.

  • 형식의 이름을 지정할 수 없으므로 메서드 반환 형식, 메서드 매개 변수 또는 필드 형식으로 사용할 수 없습니다.
  • 선언된 메서드 내에서 범위가 지정된 변수입니다.
  • 메서드, 이벤트 또는 사용자 지정 연산자를 추가할 수 없습니다.
  • 속성은 항상 읽기 전용입니다. 무명 형식은 변경 가능한 속성을 지원하지 않습니다.

대신 튜플을 사용하는 경우

대부분의 새 코드에서는 익명 형식 대신 튜플을 사용하는 것이 좋습니다. 값 형식으로 튜플은 더 나은 성능을 제공합니다. 또한 분해 지원 및 보다 유연한 구문을 제공합니다. 익명 형식은 식 트리 지원 또는 참조 형식 의미 체계가 필요한 경우 더 나은 선택으로 유지됩니다. 자세한 비교는 익명 형식과 튜플 형식 중에서 선택 항목을 참조하세요.

참고하십시오