수색…


익명 형식 만들기

익명 형식은 명명되지 않으므로 이러한 형식의 변수는 암시 적으로 형식화되어야합니다 ( 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 }
};


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow