다음을 통해 공유


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

업데이트: 2011년 4월

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

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

다음 예제에서는 Amount 및 Message라는 두 개의 속성으로 초기화된 익명 형식을 보여 줍니다.

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

// Rest the mouse pointer over v.Amount and v.Message in the following
// statement to verify that their inferred types are int and string.
Console.WriteLine(v.Amount + v.Message);

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

익명 형식에는 하나 이상의 공용 읽기 전용 속성이 포함되어 있습니다. 메서드나 이벤트와 같은 다른 종류의 클래스 멤버는 허용되지 않습니다. 속성을 초기화하는 데 사용되는 식은 null, 익명 함수 또는 포인터 형식이 될 수 없습니다.

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

익명 형식에서 멤버 이름을 지정하지 않을 경우 컴파일러는 익명 형식 멤버를 초기화하는 데 사용되는 속성과 동일한 이름을 익명 형식 멤버에 제공합니다. 앞에서 설명한 예제를 참고하여 식을 사용하여 초기화하는 속성에 이름을 제공해야 합니다. 다음 예제에서 익명 형식의 속성 이름은 Color 및 Price입니다.

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# 프로그래밍 가이드)을 참조하십시오.

다음 예제와 같이 암시적으로 형식화된 지역 변수와 암시적으로 형식화된 배열을 결합하여 익명으로 형식화된 요소의 배열을 만들 수 있습니다.

var anonArray = new[] { new { name = "apple", diam = 4 }, new { name = "grape", diam = 1 }};

설명

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

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

필드, 속성, 이벤트 또는 메서드의 반환 형식으로 익명 형식을 선언할 수 없습니다. 마찬가지로, 메서드, 속성, 생성자 또는 인덱서의 형식 매개 변수를 익명 형식으로 선언할 수 없습니다. 익명 형식이나 익명 형식이 포함된 컬렉션을 메서드에 인수로 전달하려면 매개 변수를 형식 개체로 선언할 수 있습니다. 그러나 이 작업을 수행하면 강력한 형식화의 목적이 무효화됩니다. 쿼리 결과를 저장하거나 메서드 경계 외부에 전달해야 할 경우 익명 형식 대신에 명명된 표준 구조체나 클래스를 사용하는 것을 고려합니다.

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

참고 항목

참조

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

개념

C# 프로그래밍 가이드

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

기타 리소스

C#에서 LINQ 시작

변경 기록

날짜

변경 내용

이유

2011년 4월

텍스트를 명확히 설명했습니다.

고객 의견