다음을 통해 공유


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

업데이트: 2008년 7월

익명 형식은 형식을 먼저 명시적으로 정의할 필요 없이 읽기 전용 속성 집합을 단일 개체로 캡슐화하는 편리한 방법을 제공합니다. 형식 이름은 컴파일러에 의해 생성되고 소스 코드 수준에서 사용할 수 없습니다. 속성의 형식은 컴파일러에 의해 유추됩니다. 다음 예제에서는 Amount 및 Message라는 두 개의 속성을 사용하여 초기화되는 익명 형식을 보여 줍니다.

var v = new { Amount = 108, Message = "Hello" };

익명 형식은 일반적으로 소스 시퀀스의 각 개체에서 속성의 하위 집합을 반환하기 위해 쿼리 식의 select 절에서 사용됩니다. 쿼리에 대한 자세한 내용은 LINQ 쿼리 식(C# 프로그래밍 가이드)을 참조하십시오.

익명 형식은 개체 이니셜라이저와 함께 new 연산자를 사용하여 만듭니다. 개체 이니셜라이저에 대한 자세한 내용은 개체 및 컬렉션 이니셜라이저(C# 프로그래밍 가이드)를 참조하십시오.

익명 형식은 하나 이상의 공용 읽기 전용 속성으로 구성되는 class 형식입니다. 메서드나 이벤트와 같은 다른 종류의 클래스 멤버는 허용되지 않습니다. 익명 형식은 개체를 제외한 인터페이스 또는 형식으로 캐스팅할 수 없습니다.

가장 일반적인 시나리오는 다른 형식의 일부 속성과 함께 익명 형식을 초기화하는 것입니다. 다음 예제에서는 Product라는 클래스에 Color 및 Price 속성과 원하지 않는 여러 다른 속성이 포함되어 있다고 가정합니다. Products는 Product 개체의 컬렉션입니다. 익명 형식 선언은 new 키워드로 시작됩니다. 이 키워드는 Product의 두 속성만 사용하는 새 형식을 초기화합니다. 이로 인해 쿼리에서 더 적은 양의 데이터가 반환됩니다.

익명 형식에서 멤버 이름을 지정하지 않을 경우 컴파일러는 익명 형식 멤버를 초기화하는 데 사용되는 속성과 동일한 이름을 익명 형식 멤버에 제공합니다. 식을 사용하여 초기화하는 속성에 이름을 제공해야 합니다.

var productQuery = 
    from prod in products
    select new { prod.Color, prod.Price };

foreach (var v in productQuery)
{
    Console.WriteLine("Color={0}, Price={1}", v.Color, v.Price);
}

익명 형식이 변수에 할당될 경우 해당 변수는 var 구문을 사용하여 초기화되어야 합니다. 이는 컴파일러만 익명 형식의 기본 이름에 액세스할 수 있기 때문입니다. var에 대한 자세한 내용은 암시적으로 형식화된 지역 변수(C# 프로그래밍 가이드)를 참조하십시오.

설명

익명 형식은 object에서 직접 파생되는 참조 형식입니다. 응용 프로그램에서 해당 이름에 액세스할 수는 없지만 컴파일러는 익명 형식에 이름을 제공합니다. 공용 언어 런타임의 관점에서 볼 때 익명 형식은 개체를 제외한 형식으로 캐스팅될 수 없다는 점을 제외하면 다른 참조 형식과 같습니다.

둘 이상의 익명 형식이 동일한 수와 형식의 속성을 동일한 순서로 가질 경우 이러한 익명 형식은 컴파일러에 의해 동일한 형식으로 처리되며 컴파일러에서 생성된 동일한 형식 정보를 공유합니다.

익명 형식은 메서드 범위를 가집니다. 익명 형식이나 익명 형식이 포함된 컬렉션을 메서드 경계 외부로 전달하려면 먼저 형식을 object에 캐스팅해야 합니다. 그러나 이 경우에는 익명 형식의 강력한 형식화가 무효화됩니다. 쿼리 결과를 저장하거나 메서드 경계 외부에 전달해야 할 경우 익명 형식 대신에 명명된 표준 구조체나 클래스를 사용하는 것을 고려합니다.

익명 형식은 unsafe 형식을 속성으로 포함할 수 없습니다.

익명 형식에 대한 EqualsGetHashCode 메서드가 속성의 Equals 및 GetHashcode로 정의되므로 동일한 익명 형식의 두 인스턴스는 해당 속성이 모두 같을 경우에만 동일합니다.

참고 항목

개념

C# 프로그래밍 가이드

LINQ 쿼리 식(C# 프로그래밍 가이드)

참조

개체 및 컬렉션 이니셜라이저(C# 프로그래밍 가이드)

기타 리소스

C#에서 LINQ 시작

변경 기록

날짜

변경 내용

이유

2008년 7월

소개 텍스트와 참고 단원에 캐스팅 제한 사항에 대한 정보가 추가되었습니다.

향상된 기능 관련 정보