English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
C#에서는 이름이 없는 형식(클래스)인匿名형은 공개 읽기 전용 속성만 포함할 수 있습니다. 그들은 필드, 메서드, 이벤트 등 다른 멤버를 포함할 수 없습니다.
new 연산자와 객체 초기화자 문법을 사용하여匿名형을 생성합니다. 익명형 참조를 저장하기 위해 익명 타입 변수 var를 사용합니다.
아래 예제는 Id, FirstName, LastName라는 세 가지 속성을 가진 이름이 student인匿名형 변수를 생성하는 방법을 보여줍니다.
var student = new { Id = 1, FirstName = "James", LastName = "Bond" };
匿名형의 속성은 읽기 전용이며 null, 익명 함수 또는 포인터형으로 초기화할 수 없습니다. 이러한 속성은 점(.) 표기법으로 접근할 수 있으며, 객체 속성과 같습니다. 그러나 속성의 값을 변경할 수 없습니다. 그들은 읽기 전용입니다.
var student = new { Id = 1, FirstName = "James", LastName = "Bond" }; Console.WriteLine(student.Id); //출력1 Console.WriteLine(student.FirstName); //출력:James Console.WriteLine(student.LastName); //출력:Bond student.Id = 2;//에러:값 변경 불가 student.FirstName = "Steve";//에러:값 변경 불가
匿名형의 속성에는 또 다른匿名형을 포함할 수 있습니다.
var student = new { Id = 1, FirstName = "James", LastName = "Bond", Address = new { Id = 1, City = "London", Country = "UK" } };
匿名형 배열을 생성할 수도 있습니다.
var students = new[] { new { Id = 1, FirstName = "James", LastName = "Bond" }, new { Id = 2, FirstName = "Steve", LastName = "Jobs" }, new { Id = 3, FirstName = "Bill", LastName = "Gates" } };
匿名형은 항상 정적입니다. 메서드에서 반환할 수 없습니다. 그러나,匿名형은 메서드에 객체형 파라미터로 전달할 수 있지만, 이렇게 하지 않는 것이 좋습니다. 다른 메서드에 전달하려면 struct 또는 class를 사용하십시오.
일반적으로 LINQ 쿼리의 Select 절을 사용하여 각 객체에서 속성의 부분집합을 반환하는 익명형을 생성합니다.
class Program { static void Main(string[] args) { IList<Student> studentList = new List<Student>() { new Student() { StudentID = 1, StudentName = "ジョhn", age = 18 }, new Student() { StudentID = 2, StudentName = "스티브", age = 21 }, new Student() { StudentID = 3, StudentName = "빌", age = 18 }, new Student() { StudentID = 4, StudentName = "람", age = 20 }, new Student() { StudentID = 5, StudentName = "론", age = 21 } }; var students = from s in studentList select new { Id = s.StudentID, Name = s.StudentName }; foreach(var stud in students) Console.WriteLine(stud.Id + "-" + stud.Name); } } public class Student { public int StudentID { get; set; } public string StudentName { get; set; } public int age { get; set; } }
1-ジョhn 2-스티브 3-빌 4-람 5-론
위의 예제에서 LINQ 쿼리의 select 절은 StudentID와 StudentName 속성을 선택하고 각각 Id와 Name으로 재명명합니다. 따라서 메모리와 불필요한 코드를 절약하는 데 매우 유용합니다. 쿼리 결과 집합은 StudentID와 StudentName 속성만 포함합니다. 다음 디버깅 뷰와 같이 보입니다.
Visual Studio는 익명형에 대해 Intellisense를 지원합니다.
내부에서 모든 익명형은 직접 System.Object 클래스에서 파생됩니다. 컴파일러는 일부 자동으로 생성된 이름을 가진 클래스를 생성하고, 각 속성에 적절한 타입을 값 표현식에 적용합니다. 그러나 여러분의 코드는 그것에 접근할 수 없습니다. GetType() 메서드를 사용하여 이름을 확인할 수 있습니다.
static void Main(string[] args) { var student = new { Id = 1, FirstName = "James", LastName = "Bond" }; Console.WriteLine(student.GetType().ToString()); }