수색…
익명 형식 만들기
익명 형식은 명명되지 않으므로 이러한 형식의 변수는 암시 적으로 형식화되어야합니다 ( var
).
var anon = new { Foo = 1, Bar = 2 };
// anon.Foo == 1
// anon.Bar == 2
멤버 이름을 지정하지 않으면 객체를 초기화하는 데 사용되는 속성 / 변수의 이름으로 설정됩니다.
int foo = 1;
int bar = 2;
var anon2 = new { foo, bar };
// anon2.foo == 1
// anon2.bar == 2
익명 형식 선언의식이 간단한 속성 액세스 인 경우에만 이름을 생략 할 수 있습니다. 메소드 호출 또는보다 복잡한 표현식의 경우, 특성 이름을 지정해야합니다.
string foo = "some string";
var anon3 = new { foo.Length };
// anon3.Length == 11
var anon4 = new { foo.Length <= 10 ? "short string" : "long string" };
// compiler error - Invalid anonymous type member declarator.
var anon5 = new { Description = foo.Length <= 10 ? "short string" : "long string" };
// OK
익명 vs 동적
익명 형식을 사용하면 정적 형식 검사를 유지하면서 미리 형식을 명시 적으로 정의 할 필요없이 개체를 만들 수 있습니다.
var anon = new { Value = 1 };
Console.WriteLine(anon.Id); // compile time error
반대로 dynamic
은 컴파일 타임 오류 대신 런타임 오류를 선택하는 동적 유형 검사 기능을 제공합니다.
dynamic val = "foo";
Console.WriteLine(val.Id); // compiles, but throws runtime error
익명 형식을 사용하는 일반 메서드
일반 메서드는 형식 유추를 통해 익명 형식을 사용할 수 있습니다.
void Log<T>(T obj) {
// ...
}
Log(new { Value = 10 });
LINQ 식은 익명 형식과 함께 사용할 수 있습니다.
var products = new[] {
new { Amount = 10, Id = 0 },
new { Amount = 20, Id = 1 },
new { Amount = 15, Id = 2 }
};
var idsByAmount = products.OrderBy(x => x.Amount).Select(x => x.Id);
// idsByAmount: 0, 2, 1
익명 형식으로 제네릭 형식 인스턴스화
일반 생성자를 사용하려면 익명 형식의 이름을 지정해야하며 이는 불가능합니다. 또는 유형 유추가 발생하도록 일반 메소드를 사용할 수 있습니다.
var anon = new { Foo = 1, Bar = 2 };
var anon2 = new { Foo = 5, Bar = 10 };
List<T> CreateList<T>(params T[] items) {
return new List<T>(items);
}
var list1 = CreateList(anon, anon2);
List<T>
경우 암시 적으로 형식화 된 배열은 ToList
LINQ 메서드를 통해 List<T>
로 변환 될 수 있습니다.
var list2 = new[] {anon, anon2}.ToList();
익명 형식 평등
익명 형식 평등은 Equals
인스턴스 메서드에서 제공합니다. 두 개의 객체가 동일한 유형 및 동일한 값을 a.Prop.Equals(b.Prop)
통해) 모든 속성에 대해 동일한 객체입니다.
var anon = new { Foo = 1, Bar = 2 };
var anon2 = new { Foo = 1, Bar = 2 };
var anon3 = new { Foo = 5, Bar = 10 };
var anon3 = new { Foo = 5, Bar = 10 };
var anon4 = new { Bar = 2, Foo = 1 };
// anon.Equals(anon2) == true
// anon.Equals(anon3) == false
// anon.Equals(anon4) == false (anon and anon4 have different types, see below)
두 개의 익명 유형은 속성이 동일한 이름과 유형을 가지며 동일한 순서로 나타나는 경우에만 동일하게 간주됩니다.
var anon = new { Foo = 1, Bar = 2 };
var anon2 = new { Foo = 7, Bar = 1 };
var anon3 = new { Bar = 1, Foo = 3 };
var anon4 = new { Fa = 1, Bar = 2 };
// anon and anon2 have the same type
// anon and anon3 have diferent types (Bar and Foo appear in different orders)
// anon and anon4 have different types (property names are different)
암시 적으로 형식화 된 배열
익명 형식의 배열은 암시 적 형식 지정을 사용하여 만들 수 있습니다.
var arr = new[] {
new { Id = 0 },
new { Id = 1 }
};